مكتبة دلفي للملفات الصوتية.
اقرأ وكتابة علامات التعريف (مثل الفنان ، العنوان ، الألبوم ، النوع ، ...) من العديد من تنسيقات الصوت المختلفة ، وجمع معلومات حول ملف الصوت (مثل المدة ، البت ، أخذ العينات). يأتي AudiowerKzeugebibliothek مع استخدام بسيط للغاية للمعلومات الأساسية ، ولكنه يحتوي أيضًا على ميزات قوية للوصول المتعمق إلى جميع أنواع البيانات الوصفية تقريبًا.
تنسيقات العلامات المدعومة ( BOLD: جديد في الإصدار 3.0 ):
القيود:
خاصية TTagItem.DataSize .
تمت إضافة إطارات URL والتعليق على TID3v2Tag.GetUnusedTextTags .
طريقة TOggContainer.ReadPackets(Target: TObjectList) للحصول على جميع الحزم من OGGSTEAM.
خاصية TOpusFile.VBR (والتي يجب أن تكون True في كل حالة تقريبًا) *
طرق لقراءة/كتابة ذرات عدد صحيح في ملفات M4A. ملاحظة: توخي الحذر. أحتاج إلى هذا في مشروعي الرئيسي "NEMP" لذرة "TMPO" (المعروف أيضًا باسم BPM ، يدق في الدقيقة) ، ولكن هذا لم يتم اختباره على نطاق واسع لذرات أخرى. الوثائق غير مفيدة للغاية ، وهناك بعض التناقضات فيما يتعلق بالأعداد الصحيحة الموقعة/غير الموقعة وحجم القيم (8 ، 16 ، 24 ، 32 بت).
TAGTYPE في TApeTag.GetUnusedTextTags كان ttVorbis ، صحيح هو ttApev2 .
getter و setter ل TApeTag.EAN استخدم مفاتيح مختلفة.
تم إصلاح الفوضى بنوع الكاردينال/عدد صحيح للسباق SerialNumbage في Oggpages.
ملفات FLAC: الوظيفة المحذوفة Fisvalid
تم إصلاح خطأ التحليل فيما يتعلق بـ OGGPAGES و OGGPackets (التي لم يكن لها في الواقع أي تأثير على ملفات OGG/OPUS ، ولكن على استعادة الطريقة الجديدة).
نشأت المكتبة AudiowerKzeugebibliothek من عدة مكتبات خاصة بالتنسيق لـ MP3 و Flag و OGG وغيرها. ولهذا السبب ، كان هناك الكثير من عبء الماضي الوارد في الكود. بعض التكرارات ، لا تناسق في ترتيب المعلمة ، النوع أو التسمية ، وبعض المضايقات الأخرى.
مع الإصدار 3.0 ، أحاول تحسين الاتساق العام وسهولة الاستخدام للطرق المقدمة. ومع ذلك ، لا يمكن القيام بذلك إلى أسفل متوافق.
هناك العديد من التغييرات ، وستحتاج إلى إجراء تغييرات مماثلة في الكود الخاص بك.
انظر Changelog للحصول على بعض التفاصيل.
يمكنك استخدام هذه المكتبة على "مستويات" مختلفة ، ولكن لا يوجد تمايز حقيقي بين هذه المستويات. يمكنك فقط استخدام أكثر أو أقل من ميزات هذه المكتبة. اعتمادًا على ما تريد القيام به ، يوصى بمعرفة أكثر أو أقل عن الهيكل الداخلي لـ "ملفات الصوت".
TTagItem . تحتوي العديد من هذه الكائنات على معلومات نصية ، لكن الصور أو البيانات الثنائية الأخرى ممكنة أيضًا.انظر المشاريع التجريبية للحصول على أمثلة.
TBaseAudioFile (Unit Audiofiles.base.pas): فئة مجردة تعلن عن بعض الخصائص الأساسية مثل العنوان ، الفنان ، الألبوم ، المدة وبعضها الآخر ، والتي يتم تنفيذها بعد ذلك في فصول TxxxFile التالية.TMP3File ، TOggVorbisFile ، TFlacFile ، ... (الوحدات المنفصلة): فئات للعديد من الأنواع ، التي تنفذ الأساليب المجردة المعلنة في tbaseaudiofile ، وقد تحدد بعض الطرق الأخرى. إذا كنت تريد المزيد من المعلومات حول ملف ، فقد تحتاج إلى الوصول صراحة إلى خصائص وطرق هذه الفئات المشتقة. هناك أيضًا بعض "الفئات المتوسطة" مثل TBaseApeFile أو TBaseVorbisFile للعديد من أنواع الملفات التي تحتوي على علامات APEV2 أو Vorbis.TAudioFileFactory (Unit Audiofiles.factory.pas): فئة المصنع لإنشاء مثيلات ملف الصوت الصحيحة بناءً على ملحق الملف.TTagItem (وحدة 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 ) ، هناك أنواع مختلفة من التنسيق مثل tctLyrics أو tctUserText لـ ID3V2 أو tctExternal لـ APEV2 أو tctGenre لملفات M4A. بالنسبة لبعض هذه الأنواع ، من المعقول اعتبارها نصًا ، حتى لو كان لديهم بنية داخلية مختلفة ويجب معاملتها بشكل منفصل. يمكن ضبط معلمة 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 التي في كثير من الأحيان. بدلاً من ذلك ، تعمل مباشرة مع الفصول المشتقة وحاويات البيانات الوصفية المحددة.
نظرًا لأن هذا يمنحك وصولًا أساسيًا للغاية إلى الملفات وهيكلها الداخلي ، يمكنك أيضًا القيام بالكثير من الهراء معهم ، مما قد يؤدي إلى مشاكل في البرامج الأخرى. يكون ذلك لأنك لا تلتزم بالمعايير الموثقة أو لأنك تقسم القواعد غير الرسمية بشكل عام. من الممكن كتابة علامة ID3V2 في ملف OGG ، ولكن بالتأكيد ليست فكرة جيدة. لا يكتب تعليق Vorbis إلى ملف MP3.
استخدم الخيارات المقدمة بحذر - خاصة مع الوصول إلى الكتابة.
راجع العرض التوضيحي "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 بتلك التنسيقات الآن بمعالجة TXXXFILE تمامًا معالجة TAG ID3V1. يتم اكتشاف وجود TAG ID3V2 (ويتم اعتبار حجمه لحساب المدة ، إذا لزم الأمر) ، ولكن يتم تجاهله.
بالنسبة لملفات MP3 والملفات المستندة إلى APE ، يمكنك استخدام خصائص TagsToBeWritten و TagsToBeDeleted و DefaultTags لتحديد العلامات الوصفية التي تتم كتابتها/إزالتها في/من الملف عند استخدام Method 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 إذا كنت تقوم بمسح ملفات متعددة لبيانات META (على سبيل المثال لتخزين البيانات في مكتبة الوسائط) ، فقد ترغب فقط في "العنوان" ، لكنك لا تهتم بما إذا كان ذلك يأتي من ID3v2- أو ID3V1-TAG. لتسريع المسح الضوئي (على الأقل هذا هو الأمل) ، يتم تقديم خاصية TagScanMode . القيم الممكنة
TTagScanMode = (id3_read_complete, id3_read_smart, id3_read_v2_only ); القيمة الافتراضية هي id3_read_complete ، حيث تتم معالجة جميع العلامات الموجودة. سيقوم الخيار id3_read_smart بالتحقق من ID3V2-TAG أولاً. هذه علامة التعريف هذه أكثر تعقيدًا ، ولكن يجب قراءتها على أي حال للوصول إلى بيانات الصوتية الصوتية مثل معدل البت والمدة وغيرها من الأشياء. في الوضع الذكي ، تتم قراءة TAG ID3V1 فقط من الملف ، إذا لم يكن هناك ID3V2-TAG يحتوي على فنان ، عنوان ، ألبوم ، مسار ، السنة والنوع. إذا كنت ترغب أيضًا في تضمين حقل "التعليق" ، فقم بتعيين fSmartRead_IgnoreComment إلى False .
إذا قمت بتغيير إحدى هذه الخصائص من خلال مستقديات الفئة TMP3File ، فستضمن الخاصية fSmartRead_AvoidInconsistentData (الافتراضي: True ) أن تتم معالجة ID3V1-TAG أيضًا بشكل صحيح ، بحيث يكتب UpdateFile كل من ID3V1- و ID3V2 مع بيانات متسقة (وفقًا لبيئة TagWriteMode ).
ملاحظة: بالنسبة للملفات المستندة إلى APE ، لا يلزم ذلك. يتطلب اكتشاف علامات APE دائمًا فحص (وقراءة) علامات ID3V1 أيضًا ، لذلك لا يوجد تسريع كبير ممكن.
عادةً ما تحتوي ملفات MP3 المشفرة باستخدام معدل البت المتغير على ما يسمى بـ Xing-Header (أو شيء مشابه) يحتوي على بيانات إضافية مطلوبة لحساب سريع لمدة الملف. لقد وجدت مؤخرًا بعض الملفات دون مثل هذا الرائد ، مما أدى إلى فترات محسوبة أطول بكثير ، وطريقة البيت المنخفضة جدًا (أي 32 كيلو بايت/ثانية). لم تكن هذه مشكلة فقط لهذه المكتبة ، ولكن لا تزال للعديد من المكتبات الأخرى.
لمثل هذه الملفات ، يتم تقديم الخاصية الجديدة TMP3File.MpegScanMode . القيم الممكنة
TMpegScanMode = (MPEG_SCAN_Fast, MPEG_SCAN_Smart, MPEG_SCAN_Complete);MPEG_SCAN_Fast يقوم بمسح الملف كما كان من قبل ، بحسن نية ، أن ملف VBR يحتوي على رأس Xing (أو أي شيء مكافئ). هذا يعمل بشكل جيد للغاية في معظم الحالات.MPEG_SCAN_Smart ، ما إذا كانت النتيجة من المسح السريع منطقيًا. إذا كان معدل البت المحسوبة 32 kbit/s (أو حتى أقل ، وهو ما سيكون غير صالح بالفعل) ، فمن المحتمل أن يكون هناك شيء خاطئ. لذلك ، تتم معالجة الملف بالكامل ، ومسح كل MPEG-Frame. لاحظ أن معظم ملفات MP3 تبدأ مع لحظة صمت صغيرة. من المحتمل أن يستخدم المشفر الذي تم تعيينه على "VBR" الحد الأدنى الممكنة من المساحة لتشفير هذا - وهو 32 كيلو بايت/ثانية.MPEG_SCAN_Complete دائمًا بلا الملف الكامل. هذا يؤدي إلى فترات أكثر دقة ، ولكنه يتطلب أيضًا المزيد من الوقت. الوضع الافتراضي هو MPEG_SCAN_Smart .
يجب أن تعمل هذه المكتبة مع جميع إصدارات Delphi من Delphi 7 إلى Delphi 12 . ومع ذلك ، هناك بعض الأشياء التي يجب وضعها في الاعتبار مع الإصدارات القديمة دون دعم Unicode المدمج (= قبل Delphi 2009).
ملاحظة : أستخدم "Unicode" هنا بمعنى "أكثر من Ansi". هذا ليس دقيقًا بنسبة 100 ٪ ، لكنني آمل أن تعرف ما أقوله. ؛-)
قبل Delphi 2009 ، كان VCL ANSI فقط ولم يدعم Unicode. يتضمن ذلك عرض الأوتار مع أحرف Unicode وفتح الملفات بأحرف Unicode في أسماء الملفات الخاصة بهم. لذلك ، كانت هناك مجموعة من المكونات تسمى "Tntunicodecontrols". كانت الإصدارات القديمة من هذه المجموعة متاحة بموجب ترخيص Creative Commons ، ويجب العثور عليها في مكان ما.
يمكن لهذه المكتبة الاستفادة من عناصر التحكم هذه عن طريق تنشيط مفتاح التحويل البرمجي في ملف config.inc . فقط قم بإزالة "." في السطر {.$DEFINE USE_TNT_COMPOS} .
داخل المكتبة نفسها ، يتم استخدام TNTs للفئة TNTFileStream . بالطبع يمكنك استخدام فئات Filestream الأخرى القادرة على Unicode أيضًا. ما عليك سوى ضبط خطوط التعليمات البرمجية هذه وفقًا لاحتياجاتك: (ملف: Audiofiles.declarations.pas)
{ $IFDEF USE_TNT_COMPOS }
TAudioFileStream = TTNTFileStream;
{ $ELSE }
TAudioFileStream = TFileStream;
{ $ENDIF }إذا كنت تستخدم إصدار Delphi الأقدم بدون Tntunicodecontrols ، فستظل هذه المكتبة تعمل ، لكن لا يمكنك فتح ملفات بأسماء ملفات مثل "จักรพรรณ์ อาบครบุรี - 10 เท่านี้ก็ตรม. mp3". عندما تحاول عرض معلومات حول العنوان والفنان من هذا الملف (بعد إعادة تسميته) ، سترى فقط بعض "؟؟؟؟؟" بدلا من العنوان الفعلي. لاحظ أن إعادة كتابة علامات التعريف في ظل هذه الظروف قد تؤدي إلى فقدان البيانات.
ملاحظة : لا تستخدم مشاريع العينة tntcontrols (مثل ttntedit بدلاً من TEDIT). كن حذرا هناك مع دلفيس الأقدم. ؛-)
تحتوي إصدارات Delphi الأحدث (2009 وما بعدها) على دعم Unicode المدمج ، وبالتالي فإن استخدام هذه tntunicodecontrols غير مطلوب. بالإضافة إلى ذلك ، لا يلزم وجود تعريف نوع UnicodeString هناك. هذا هو السبب في مفتاح التحويل البرمجي هذا:
{$IFNDEF UNICODE}
UnicodeString = WideString;
{$ENDIF}
في الإصدار 2.0 من هذه المكتبة ، أستخدم نمط المصنع لأنواع مختلفة من Audiofiles. يتم تسجيل فئة لتنسيق ملف صوتي محدد في فئة المصنع. لإدارة جميع الفئات المسجلة ، تستخدم فئة المصنع tdictionary افتراضيًا. إذا كان إصدار Delphi الخاص بك لا يدعم tdictionary ، فقم بتحديد استخدامه في confic.inc . في هذه الحالة ، سيتم استخدام TOUGELIST العادي لذلك.
{$DEFINE USE_DICTIONARY}
لزيادة سرعة الوصول في قائمة TocjectList ، يتم تنفيذها كقائمة تنظيم ذاتي ، باستخدام "طريقة Transpose". إذا تم إنشاء ملف صوتي يحتوي على تمديد اسم ملف محدد من خلال المصنع ، فسيتم نقل هذا التمديد/الفئة للأعلى في القائمة ، مما يقلل من الوقت للعثور عليه مرة أخرى.
يجب أن تقرأ هذه المكتبة المعلومات بشكل صحيح من جميع أنواع الملفات الصوتية في معظم الحالات. ومع ذلك ، هناك بعض ملفات الصوت الفردية "في البرية" ، باستخدام الأساليب أو المتغيرات التي لا يتم التعامل معها بشكل صحيح من قبل هذه المكتبة. أعتقد أنه بعد سنوات Severals ، أتعامل مع كل شيء تقريبًا في الوقت الحالي ، ولكن قد لا تزال هناك بعض الحالات النادرة التي أفتقدها.
إذا وجدت خطأ ، أو إذا كان لديك بعض ملفات الصوت (وخاصة ملفات MP3!) ، حيث توفر طرق هذه المكتبة بيانات خاطئة ، يرجى الاتصال بي و/أو إرسال بعض الملفات إلى [email protected].
لكن لا يمكنني (ولن) إصلاح كل شيء. كان أكثر ما رأيته أكثر جنونًا في أي وقت مضى هو ID3V2TAG مع الترميز التالي: UTF-16 (غرامة) ، مُغلفة فارغة (أكثر أو أقل قياسية) ، بدءًا من BOM (OK ...) ، شخصية شخصية (WTF ...؟)-نعم ، لا تمزح. ما مجموعه 6 بايت لكل حرف ...