オーディオファイル用のDelphiライブラリ。
多くの異なるオーディオ形式からメタタグ(アーティスト、タイトル、アルバム、ジャンルなど)を読み取り、書き込み、オーディオファイル(期間、ビットレート、サンプルなど)に関する情報を収集します。 audiowerkzebibibliothekには、基本情報のための非常にシンプルな使用法が搭載されていますが、ほぼすべての種類のメタデータへの詳細なアクセスのための強力な機能も含まれています。
サポートされているタグ形式(太字:v3.0の新規):
制限:
プロパティTTagItem.DataSize 。
URLフレームを追加し、 TID3v2Tag.GetUnusedTextTagsにコメントしました。
メソッドTOggContainer.ReadPackets(Target: TObjectList) oggstreamからすべてのパケットを取得します。
プロパティTOpusFile.VBR (ほぼすべての場合にTrueはずです) *
M4Aファイルで整数原子を読み取り/書き込む方法。注:注意して使用してください。 「TMPO」原子のメインプロジェクト「NEMP」(別名BPM、1分あたりのビート)でこれが必要ですが、これは他の原子では広くテストされていません。ドキュメントはあまり役に立たず、署名/符号なしの整数と値のサイズに関するいくつかの矛盾があります(8、16、24、32ビット)。
TApeTag.GetUnusedTextTagsのtagTypeはttVorbisでした、正しいのはttApev2でした。
TApeTag.EAN用のゲッターとセッターは、さまざまなキーを使用しました。
OggpagesのSerialNumber用のCardinal/Integer Typeでクラッターを修正しました。
FLACファイル:削除された非推奨機能fisvalid
OggpagesとOggpacketsに関する解析エラーを修正しました(実際にはOGG/OPUSファイルに影響を与えませんでしたが、新しいメソッドReadPacketsに影響を与えました)。
図書館AudiowerkzeBibliothekは、mp3、flag、oggなどのいくつかの形式固有のライブラリから生まれました。そのため、コードに含まれる過去の負担がたくさんありました。いくつかの重複、パラメーターの順序、タイプまたは命名の一貫性はなく、その他の不便さ。
バージョン3.0では、提供された方法の全体的な一貫性と使いやすさを改善しようとします。ただし、これを下方に互換性のあるものにすることはできません。
多くの変更があり、コードに対応する変更を行う必要があります。
いくつかの詳細については、changelogを参照してください。
このライブラリをさまざまな「レベル」で使用できますが、これらのレベルには実際の区別はありません。このライブラリの機能から多かれ少なかれ使用できます。やりたいことに応じて、「オーディオファイル」の内部構造について多かれ少なかれ知ることをお勧めします。
TTagItemクラスのオブジェクトです。これらのオブジェクトの多くにはテキスト情報が含まれていますが、画像または他のバイナリデータも可能です。例については、デモプロジェクトを参照してください。
TBaseAudioFile (unit audiofiles.base.pas):タイトル、アーティスト、アルバム、期間などの基本的なプロパティを宣言する抽象クラスで、次のTxxxFileクラスで実装されます。TMP3File 、 TOggVorbisFile 、 TFlacFile 、...(seperate units):Tbaseaudiofileで宣言された抽象的なメソッドを実装し、さらにいくつかの方法を定義する可能性のあるいくつかのfiletypesのクラス。ファイルに関する詳細情報が必要な場合は、これらの派生クラスのプロパティとメソッドに明示的にアクセスする必要がある場合があります。また、APEV2タグやVorbisのコメントを含むいくつかのファイルタイプについて、 TBaseApeFileやTBaseVorbisFileなどの「中間クラス」もいくつかあります。TAudioFileFactory (unit audiofiles.factory.pas):ファイル拡張機能に基づいて正しいオーディオファイルインスタンスを作成するための工場クラス。TTagItem (unit audiofiles.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」を参照してください。
重要な注意:工場はおそらくスレッドセーフではありません。セカンダリスレッドで使用する場合は、スレッドのコンテキスト内で別の工場を作成する必要があります。
提供された名前のプロパティ(アーティスト、タイトルなど)で十分でない場合、audiofile.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タグで考慮すべき微妙さもいくつかあります。たとえば、「歌詞」には、テキスト自体だけでなく、いくつかの追加データなども含まれています。この目的のために、Audio Werkzeuge Bibliothekは、列挙タイプのteTagContentTypeとteTextModeを提供します。 TagContentTypeは、コンテンツの種類に関する情報を提供します。いくつかの一般的に有効なタイプ( tctText, tctPicture, tctBinary )に加えて、ID3v2のtctLyricsまたはtctUserTextなど、M4aファイルのtctExternal 、またはtctGenreなどのさまざまな形式固有のタイプがあります。これらのタイプの一部については、異なる内部構造があり、個別に扱われるべきであっても、テキストと見なすことが合理的です。 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 ;詳細については、Demo "DemoExtended]を参照してください。
専門家レベルでは、頻繁に基本的なクラスのTBaseAudioFileを使用しなくなりました。代わりに、派生クラスと特定のメタデータコンテナを直接使用します。
これにより、ファイルとその内部構造への非常に基本的なアクセスが得られるため、他のプログラムの問題につながる可能性のある多くのナンセンスを行うこともできます。それは、あなたが文書化された標準を遵守しないから、または一般的に認識されている非公式のルールを破るからです。 OGGファイルにID3v2タグを作成することは可能ですが、確かに良い考えではありません。どちらもvorbisコメントをmp3ファイルに書いていません。
特に書き込みアクセスを使用して、注意して提供されるオプションを使用してください。
可能なことの詳細については、Demo "demomp3"を参照してください(常に推奨されるとは限りませんが、一部のプレイヤーはこれらのファイルについてつまずく場合があります)。
いくつかのオーディオ形式には、ファイル内に異なる種類のメタデータが含まれる場合があります。このライブラリは、次の仮定を使用します
MP3ファイルには通常、ID3V1およびID3v2-TAGが含まれています。クラスTMP3Fileを使用する場合、通常、両方のバージョンがファイルで一貫性を保つことが保証されます。
MP3ファイルには、APEV2-TAGも含まれている場合があります。このタグは、クラスTMP3Fileによっても完全に処理されています。基本的なプロパティを設定すると、すべてのメタタグが一貫していることが保証されます。 Property TagsToBeWrittenにmt_Existing (デフォルト値)が含まれていることを確認してください。
VorbisコメントとAPEV2タグに「歌詞」に定義された標準キーはありません。私の研究によると、次のバリエーションが使用されています: UNSYNCEDLYRICS 、 UNSYNCED LYRICS (スペース付き)、 LYRICS 。これらの3つのキーは、「歌詞」を読むときに考慮されます。書くとき、既存のキーが使用されます。 3つのバリエーションのいずれも利用できない場合、グローバル変数AWB_DefaultLyricsKeyのキーセットが使用されます。デフォルトの値はUNSYNCEDLYRICSです。
デフォルトでAPEV2-TAGを使用したすべてのオーディオ形式(Monkey、Wavpack、Musepack、Optimfrog、Trueaudio)には、ID3v1-およびID3v2-TAGも含まれている場合があります。これらの形式のTxxxFileクラスは、ID3v1-TAGを完全に処理するようになりました。 ID3V2-TAGの存在が検出されます(必要に応じて、そのサイズは期間の計算に対して考慮されます)が、それ以外の場合は無視されます。
MP3ファイルおよびAPEベースのファイルの場合、 TagsToBeWritten 、 TagsToBeDeleted 、およびDefaultTagsを使用して、メソッドUpdateFileまたは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をチェックします。このメタタグはより複雑ですが、BitRate、期間などのオーディオメタデータを把握するには、とにかく読む必要があります。スマートモードでは、ID3V1-TAGはファイルからのみ読み取られます。これは、アーティスト、タイトル、アルバム、トラック、年、ジャンルを含む適切なID3v2-TAGが含まれていない場合のみです。 「コメント」フィールドも必要な場合は、 fSmartRead_IgnoreComment Falseに設定します。
これらのプロパティのいずれかをクラスTMP3Fileのセッターを介して変更すると、プロパティfSmartRead_AvoidInconsistentData (デフォルト: True )がID3V1-TAGも適切に処理されることを保証し、 UpdateFile ID3V1-とID3V2-TAGの両方を一貫したデータで書き込みます( TagWriteModeの設定に従って)。
注: APEベースのファイルの場合、これは必要ありません。類人猿のタグを検出するには、常にID3v1タグをチェック(および読む)必要があるため、重要なスピードアップはありません。
通常、可変ビットレートでエンコードされたMP3ファイルには、ファイルの期間を迅速に計算するために必要な追加データを含むいわゆるXing-Header(または同様のもの)が含まれています。最近、私はそのようなXing-Headerのないいくつかのファイルを見つけました。その結果、計算された時間がはるかに長くなり、ビットレートが低すぎます(つまり、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常に完全なファイルをsansします。これは最も正確な期間につながりますが、さらに多くの時間が必要です。デフォルトモードはMPEG_SCAN_Smartです。
このライブラリは、Delphi 7からDelphi 12までのすべてのDelphiバージョンで動作するはずです。ただし、Unicodeサポートが組み込まれていない古いバージョン(= Delphi 2009の前)に留意すべきことがいくつかあります。
注:ここでは、「ANSI以上」の意味で「Unicode」を使用しています。それは100%正確ではありませんが、私が言っていることを知っていることを願っています。 ;-)
Delphi 2009以前は、VCLはANSI-ONLYであり、Unicodeをサポートしていませんでした。これには、Unicode文字を備えた文字列の表示と、ファイル名にUnicode文字を持つファイルを開くことが含まれます。そのために、「Tntunicodecontrols」と呼ばれるコンポーネントのコレクションがありました。このコレクションの古いバージョンは、Creative Commonsライセンスの下で入手できましたが、どこかにあるはずです。
このライブラリは、ファイルconfig.incのコンパイラスイッチをアクティブにすることにより、これらのコントロールを利用できます。 「」を削除するだけです。ライン{.$DEFINE USE_TNT_COMPOS} 。
ライブラリ自体内では、TNTがクラスTNTFileStreamに使用されます。もちろん、他のUnicode対応Filestreamクラスも使用できます。あなたのニーズに応じてこれらのコード行を調整するだけです:(file:audiofiles.declarations.pas)
{ $IFDEF USE_TNT_COMPOS }
TAudioFileStream = TTNTFileStream;
{ $ELSE }
TAudioFileStream = TFileStream;
{ $ENDIF }Tntunicodecontrolsのない古いDelphiバージョンを使用している場合、このライブラリは引き続き機能しますが、「จักรพรรณ์-10เท่านี้ก็ตรม。Mp3」などのファイルを持つファイルを開くことはできません。そのようなファイルからタイトルとアーティストに関する情報を表示しようとすると(名前を変更した後)、「?????」だけが表示されます。実際のタイトルの代わりに。このような条件下でメタタグを書き換えると、データの損失につながる可能性があることに注意してください。
注:サンプルプロジェクトでは、TNTControls(TEDITの代わりにTTNTEDITなど)を使用しません。古いデルフィスには注意してください。 ;-)
新しいDelphiバージョン(2009以降)には、ユニコードサポートが組み込まれているため、これらのTntunicodecontrolsの使用は必要ありません。さらに、型UnicodeStringの定義はそこに必要はありません。これがこのコンパイラスイッチの理由です。
{$IFNDEF UNICODE}
UnicodeString = WideString;
{$ENDIF}
このライブラリのバージョン2.0では、さまざまな種類のオーディオファイルに工場パターンを使用しています。特定のオーディオファイル形式のクラスは、工場クラスに登録されています。登録されたすべてのクラスを管理するために、工場クラスはデフォルトでtdictionaryを使用します。 Delphiバージョンがtdictionaryをサポートしていない場合は、 confic.incでその使用法を定義しません。その場合、そのためには通常のtobjectListが使用されます。
{$DEFINE USE_DICTIONARY}
TobjectListのアクセス速度を上げるために、「Transoppesメソッド」を使用して、自己組織化リストとして実装されます。特定のFilename拡張機能を備えたオーディオファイルがファクトリーを介して作成された場合、この拡張機能/クラスはリスト内に上向きに移動し、再びそれを見つける時間を短縮します。
このライブラリは、ほとんどの場合、あらゆる種類のオーディオファイルから情報を正しく読み取る必要があります。ただし、このライブラリで適切に処理されていない方法またはバリアントを使用して、「Wild in the Wild」という奇妙なオーディオファイルがいくつかあります。 Severalsの後、私は今、ほとんどすべてに対処しているが、私が欠けていることはまだいくつかのまれなケースがあるかもしれないと思います。
バグが見つかった場合、またはこのライブラリのメソッドが間違ったデータを提供するオーディオファイル(特にMP3ファイル!)がある場合は、私に連絡し、/またはサンプルファイルを[email protected]に送信してください。
しかし、私はすべてを修正することはできません(そしてしません)。私が今まで見た中で最もクレイジーなことは、次のエンコードを備えたID3v2TAGでした:UTF-16(微細)、ヌル終了(多かれ少なかれ標準)、BOM(OK ...)、キャラクターバイキャラクター(WTF ...?) - はい、冗談です。文字ごとに合計6バイト...