用於音頻文件的Delphi庫。
從許多不同的音頻格式中讀取和寫入元標記(例如藝術家,標題,專輯,流派,...),並收集有關音頻文件的信息(例如持續時間,比特率,採樣)。 AudiowerKzeugebibliothek具有非常簡單的用法,用於基本信息,但它還包含了幾乎所有類型的元數據的強大功能。
支持的標籤格式( BOLD:new v3.0中的新):
限制:
屬性TTagItem.DataSize 。
添加了URL框架並在TID3v2Tag.GetUnusedTextTags中註釋。
方法TOggContainer.ReadPackets(Target: TObjectList)從OggStream獲取所有數據包。
屬性TOpusFile.VBR (幾乎在每種情況下都應該是True ) *
在M4A文件中讀取/寫入整數原子的方法。注意:謹慎使用。我需要在我的主要項目“ NEMP”中進行“ TMPO”原子(又稱BPM,每分鐘節拍),但這並未對其他原子進行廣泛的測試。那裡的文檔不是很有幫助,並且有關簽名/未簽名的整數和值的大小存在一些不一致之處(8、16、24、32位)。
TApeTag.GetUnusedTextTags ttApev2的tagtype ttVorbis
TApeTag.EAN的getter和setter使用了不同的鍵。
用紅衣主教/整數類型修復了oggpages中的連續名單的混亂。
FLAC文件:已刪除的刪除功能Fisvalid
修復了有關OGGPAGES和OGGPACKET的解析錯誤(實際上對OGG/Opus文件沒有影響,但對新方法ReadPackets沒有影響)。
圖書館AudiowerKzeugebibliothek源自MP3,Flag,Ogg等的幾個格式特定的庫。因此,《法規》中有很多過去的負擔。一些重複,參數順序,類型或命名以及其他一些不便。
使用3.0版,我嘗試提高所提供方法的總體一致性和可用性。但是,不可能向下兼容。
有很多更改,您需要在代碼中進行相應的更改。
有關一些詳細信息,請參見ChangElog。
您可以在不同的“級別”上使用此庫,但是這些級別之間沒有真正的區別。您可以或多或少地從此庫的功能中使用。根據您想做的事情,建議您或多或少了解“音頻文件”的內部結構。
TTagItem類的對象。這些對像中有許多包含文本信息,但是圖像或其他二進制數據也可以。有關示例,請參見演示項目。
TBaseAudioFile (單位Audiofiles.base.pas):一個抽像類聲明一些基本屬性,例如標題,藝術家,專輯,持續時間等,然後在以下TxxxFile類中實現。TMP3File , TOggVorbisFile , TFlacFile ,...(單獨的單位):幾種filetypes的類,這些類別實現了在tbaseaudiofile中聲明的抽象方法,並且可以定義更多方法。如果您想要有關文件的更多信息,則可能需要明確訪問這些派生類的屬性和方法。對於幾種包含APEV2-TAGS或VORBIS註釋的文件類型,也有一些“中間類”,例如TBaseApeFile或TBaseVorbisFile 。TAudioFileFactory (單位Audiofiles.factory.pas):基於文件擴展程序創建正確的音頻文件實例的工廠類。TTagItem (Autioofiles.basetags.pas):元數據容器中所有單個元素的抽象基類。從本質上講,提供了一個“鍵”和“值”,並補充了有關數據元素的其他一些信息。源自此的是TID3v2Frame , TApeTagItem , TCommentVector等類。TID3v1Tag , TID3V2Tag , TApeTag , TVorbisComments ...(單獨的單位,沒有共同祖先):實現單個元數據容器。極為簡化:TTAGITEMS列表。 對於初學者來說,該庫的使用非常容易。只需使用工廠創建一個類型的TBaseAudioFile對像以顯示某些屬性,讓用戶編輯一些值並更新文件。就這樣。使用所有受支持的文件格式-MP3,OGG,FLAC,M4A,都無關緊要。所有人的代碼相同。
var
MainAudioFile: TBaseAudioFile;
// ...
MainAudioFile := AudioFileFactory.CreateAudioFile(aFileName);
MainAudioFile.ReadFromFile(aFileName);
EditTitle.Text := MainAudioFile.Title;
// ... and for editing the file:
MainAudioFile.Title := EditTitle.Text;
MainAudioFile.UpdateFile;請注意,您不需要創建(或免費)AudiofileFactory-Object。這是由單位AudioFiles.Factory.pas自動處理的。
有關詳細信息,請參見演示“ Demosimple”。
重要說明:工廠可能不是線程安全。如果要在輔助線程中使用它,則應在線程的上下文中創建另一個工廠。
如果提供的命名屬性(例如藝術家,標題和其他屬性還不夠,則有Audiiofile.GetTaglist方法(本庫的版本3中的新方法)。這使您可以在文件中列出和編輯所有數據元素。
lvMetaTags.Clear; // a ListView on the Form
TagItems := TTagItemList.Create;
try
AudioFile.GetTagList(TagItems);
for i := 0 to TagItems.Count - 1 do begin
newListItem := lvMetaTags.Items.Add;
newListItem.Data := TagItems[i];
newListItem.Caption := cTagTypes[TagItems[i].TagType];
newListItem.SubItems.Add(TagItems[i].Key);
newListItem.SubItems.Add(TagItems[i].Description);
newListItem.SubItems.Add(TagItems[i].GetText(tmReasonable));
end ;
finally
TagItems.Free;
end ;要從此列表中編輯元素,您可以使用以下代碼:
editItem := TTagItem(lvMetaTags.Selected.Data);
editValue := editItem.GetText(tmReasonable);
if InputQuery( ' Edit Item ' , ' New value: ' , editValue) then begin
if editValue = ' ' then
AudioFile.DeleteTagItem(editItem)
else
TTagItem(editItem).SetText(editValue, tmReasonable);
end ;雖然音頻文件中的大多數元數據都包含文本,但有些數據具有更複雜的結構,甚至包含純二進制數據。如何識別數據類型因格式而異。可能的類型有時也會更多,有時甚至更少。而且,“文本”也有一些細微之處,尤其是在ID3V2標籤上。例如,“歌詞”不僅包含文本本身,還包含一些其他數據,例如語言。為此,音頻Werkzeuge Bibliothek提供了枚舉類型teTagContentType和teTextMode 。 TagContentType提供了有關內容類型的信息。除了幾種通常有效的類型( tctText, tctPicture, tctBinary )外,還有各種格式特異性類型,例如用於ID3V2的tctLyrics或tctUserText ,用於M4A文件的APEV2或tctGenre tctExternal對於其中一些類型,即使它們具有不同的內部結構,也應分別處理。為此目的,可以將TextMode參數設置為tmReasonable 。閱讀數據時,也可以使用tmForced 。然後,二進制數據也以文本形式顯示(不可打印的字符被點替換為“。”)。
AudioFile.GetTagList(TagItems);具有可選參數,您可以在其中定義要包含在Tagitems列表中的哪種標籤。
procedure GetTagList(Dest: TTagItemList; ContentTypes: TTagContentTypes = cDefaultTagContentTypes);
默認值將返回可以解釋為文本的各種標籤,即
cDefaultTagContentTypes = [tctText, tctComment, tctLyrics, tctURL, tctUserText, tctUserURL, tctExternal, tctTrackOrDiskNumber, tctGenre, tctSpecialText];
大多數元數據容器都允許一張以上的圖片,也就是“封面藝術”。如果要顯示封面藝術,則需要先獲取所有圖片標籤項目的列表。
picList := TTagItemList.Create;
try
AudioFile.GetTagList(picList, [tctPicture]);
if picList.Count > 0 then begin
// show first picture in the list, or try to get the "Front Cover"
// here: Just diplay the first one in the list (which ist often
// the only one)
stream := TMemoryStream.Create;
try
if picList[ 0 ].GetPicture(stream, Mime, PicType, Description)
then begin
Stream.Position := 0 ;
// Modern versions of Delphi also recognize the graphic type when
// using LoadFromStream
// For older versions, you may have to adapt the code depending
// on the mimetype.
Image1.Picture.LoadFromStream(Stream);
end ;
finally
stream.Free;
end ;
end ;
finally
picList.Free;
end ;有關詳細信息,請參見演示“刪除”。
在專家級別上,您不再使用經常使用的基本類TBaseAudioFile 。相反,您可以直接與派生的類和特定的元數據容器一起工作。
由於這為您提供了對文件及其內部結構的非常基本的訪問,因此您也可以對它們做很多胡說八道,這可能會導致其他程序問題。之所以這樣做,是因為您不遵守已記錄的標準,或者因為您打破了普遍認可的非官方規則。在OGG文件中編寫ID3V2標籤是可能的,但肯定不是一個好主意。也沒有將Vorbis評論寫入MP3文件。
使用謹慎提供的選項 - 尤其是在寫入訪問時。
有關可能的更多詳細信息,請參見Demo“ Demomp3”(但並非總是推薦的,有些玩家可能會對這些文件偶然發現)。
幾種音頻格式可能包含文件中的不同類型的元數據。該庫使用以下假設
MP3文件通常包含ID3V1和ID3V2標籤。使用類TMP3File時,通常可以確保兩個版本在文件中保持一致。
MP3文件有時還包含APEV2-TAG。現在,該標籤也通過類TMP3File完全處理。設置基本屬性將確保所有元標記保持一致。確保屬性TagsToBeWritten包含mt_Existing (這是默認值)。
Vorbis評論和APEV2標籤中沒有定義“歌詞”的標準密鑰。根據我的研究,正在使用以下變體: UNSYNCEDLYRICS , UNSYNCED LYRICS (帶有空間)和LYRICS 。閱讀“歌詞”時,考慮了這三個鍵。寫作時,使用現有密鑰。如果三個變體都沒有可用,則使用全局變量AWB_DefaultLyricsKey中的密鑰集。默認值是UNSYNCEDLYRICS 。
默認情況下,使用APEV2標籤(Monkey,Wavpack,Musepack,Optimfrog,Trueaudio)使用所有音頻格式也可能包含ID3V1-和ID3V2標籤。這些格式的TxxxFile類現在確實完全處理ID3V1-TAG。檢測到ID3V2-TAG的存在(如果需要的話,則考慮在持續時間的計算中進行的大小),但否則被忽略了。
對於MP3文件和基於APE的文件,您可以使用屬性TagsToBeWritten , TagsToBeDeleted和DefaultTags來確定使用方法UpdateFile或RemoveFile或RemoveFromFile時,將哪些元標記寫入/從文件中寫入/刪除。默認設置是
// for mp3 files
TagsToBeWritten := [mt_Existing];
DefaultTags := [mt_ID3v1, mt_ID3v2]; // **
TagsToBeDeleted := [mt_Existing];
// for ApeV2-based file formats
TagsToBeWritten := [mt_Existing];
DefaultTags := [mt_ID3v1, mt_APE]; // **
TagsToBeDeleted := [mt_Existing];
// ** used when there are no meta tags at all如果您正在掃描多個文件中的元數據(例如將數據存儲到媒體庫中),則可能只需“標題”,但是您不在乎它是來自ID3V2-還是ID3V1-TAG。為了加快掃描速度(至少這是希望),引入了屬性TagScanMode 。可能的值是
TTagScanMode = (id3_read_complete, id3_read_smart, id3_read_v2_only );默認值是id3_read_complete ,其中所有包含的標籤都已處理。選項id3_read_smart將首先檢查ID3V2-TAG。此元標記更複雜,但是無論如何都需要閱讀以獲取諸如比特率,持續時間和其他內容之類的音頻元數據。在智能模式下,只有從文件中讀取ID3V1-TAG,如果沒有適當的ID3V2-TAG包含藝術家,標題,專輯,曲目,曲目,年和流派的情況。如果您還希望包含“註釋”字段,請將fSmartRead_IgnoreComment設置為False 。
如果您通過類TMP3File的設置更改這些屬性之一,則屬性fSmartRead_AvoidInconsistentData (默認值: True )將確保還可以正確處理ID3V1-TAG,因此UpdateFile將同時編寫ID3V1-和ID3V2-TAG,並使用一致的數據(根據TagWriteMode的設置)。
注意:對於基於APE的文件,這不需要。檢測APE標籤始終也需要檢查(和讀取)ID3V1標籤,因此沒有顯著的加速。
通常,用可變比特率編碼的MP3文件包含一個所謂的Xing-header(或類似的內容),其中包含快速計算文件持續時間所需的其他數據。最近,我發現了一些沒有這樣的Xing頭標頭的文件,導致計算的持續時間更長,比特率太低(即32 kbit/s)。這不是這個庫的問題,但仍然適用於許多其他圖書館。
對於此類文件,引入了新的屬性TMP3File.MpegScanMode 。可能的值是
TMpegScanMode = (MPEG_SCAN_Fast, MPEG_SCAN_Smart, MPEG_SCAN_Complete);MPEG_SCAN_Fast與以前一樣掃描文件,誠實地說,VBR文件包含一個Xing-header(或類似的內容)。在大多數情況下,這效果很好。MPEG_SCAN_Smart檢查快速掃描的結果是否確實有意義。如果計算出的比特率為32 kbit/s(甚至較低,實際上是無效的),則可能出現問題。因此,該文件已完全處理,掃描每個MPEG框架。請注意,大多數mp3文件都以稍微沉默的一刻開始。設置為“ VBR”的編碼器可能會使用最小可能的空間來編碼此空間 - 為32kbit/s。MPEG_SCAN_Complete始終不使用完整的文件。這導致最準確的持續時間,但還需要更多的時間。默認模式是MPEG_SCAN_Smart 。
該庫應與Delphi 7到Delphi 12的所有Delphi版本一起使用。但是,在沒有內置Unicode支持的情況下,有一些事情要記住較舊的版本(= Delphi 2009之前)。
注意:我在這裡使用“ Unicode”的含義“超過ANSI”。這不是100%準確的,但我希望您知道我在說什麼。 ;-)
在Delphi 2009年之前,VCL僅為ANSI,不支持Unicode。這包括顯示帶有Unicode字符的字符串,並在其文件名中打開帶有Unicode字符的文件。為此,有一系列稱為“ tntunicodecontrols”的組件。該系列的較舊版本可在創意共享許可下獲得,並且仍應在某個地方找到。
該庫可以通過激活文件config.inc中的編譯器開關來利用這些控件。只需刪除“。”在行{.$DEFINE USE_TNT_COMPOS}中。
在庫中,TNT用於類TNTFileStream 。當然,您也可以使用其他功能Unicode的Filestream類。只需根據您的需要調整這些代碼行:(文件:Audiofiles.declarations.pas)
{ $IFDEF USE_TNT_COMPOS }
TAudioFileStream = TTNTFileStream;
{ $ELSE }
TAudioFileStream = TFileStream;
{ $ENDIF }如果您使用的是沒有Tntunicodecontrols的舊版本,則該庫仍然可以使用,但是您無法使用“จักรพรรณ์ -10เท่านี้ก็ตรม。Mp3”之類的文件名打開文件。當您嘗試從此類文件中顯示有關標題和藝術家的信息(重命名後)時,您只會看到一些“ ?????”而不是實際標題。請注意,在這種情況下重寫元標記可能會導致數據丟失。
注意:示例項目不使用TNTControls(例如TTNTEDIT而不是TEDIT)。小心舊的德爾菲斯。 ;-)
較新的Delphi版本(2009年及以後)具有內置的Unicode支持,因此不需要使用這些Tntunicodecontrols。此外,那裡不需要UnicodeString的定義。這就是該編譯器開關的原因:
{$IFNDEF UNICODE}
UnicodeString = WideString;
{$ENDIF}
在此庫的2.0版中,我為不同類型的有聲副詞使用了出廠模式。特定音頻文件格式的類在工廠類中註冊。為了管理所有註冊類,工廠類默認使用TDICTIONARY。如果您的Delphi版本不支持Tdictionary,請在confic.inc中使用它的用法。在這種情況下,將使用常規的託管清單。
{$DEFINE USE_DICTIONARY}
為了提高TobjectList的訪問速度,它使用“轉管方法”將其實現為自組織列表。如果通過工廠創建帶有特定文件名擴展名的音頻文件,則該擴展名/類將在列表中向上移動,從而減少了再次找到它的時間。
在大多數情況下,該庫應正確讀取各種音頻文件的信息。但是,使用該庫未正確處理的方法或變體“在野外”中有一些奇怪的音頻文件。我認為,經過幾年的時間,我現在幾乎要應對所有內容,但是仍然可能會缺少一些難得的情況。
如果您發現一個錯誤,或者有一些音頻文件(尤其是mp3文件!),該庫的方法提供了錯誤的數據,請與我聯繫和/或將一些示例文件發送到[email protected]。
但是我不能(也不會)修復所有問題。我見過的最瘋狂的事情是一個ID3V2TAG,其中包含以下編碼:UTF-16(fine),無效終止(或多或少的標準),從BOM(OK ...)開始,逐個字符(wtf ...?) - 是的,是的。每個字符總共6個字節...