ไลบรารี Delphi สำหรับไฟล์เสียง
อ่านและเขียนเมตาแท็ก (เช่นศิลปินชื่ออัลบั้มประเภท ... ) จากรูปแบบเสียงที่แตกต่างกันมากมายและรวบรวมข้อมูลเกี่ยวกับไฟล์เสียง (เช่นระยะเวลา, บิตเรต, ตัวอย่าง) Audiowerkzeugebibliothek มาพร้อมกับการใช้งานง่าย ๆ สำหรับข้อมูลพื้นฐาน แต่มันยังมีคุณสมบัติที่ทรงพลังสำหรับการเข้าถึงข้อมูลเมตาเกือบทุกประเภท
รูปแบบแท็กที่รองรับ ( BOLD: ใหม่ใน v3.0 ):
ข้อ จำกัด :
คุณสมบัติ TTagItem.DataSize
เพิ่มเฟรม URL และแสดงความคิดเห็นไปที่ TID3v2Tag.GetUnusedTextTags
วิธี TOggContainer.ReadPackets(Target: TObjectList) เพื่อรับแพ็กเก็ตทั้งหมดจาก Oggstream
Property TOpusFile.VBR (ซึ่งควรเป็น True ในเกือบทุกกรณี) *
วิธีการอ่าน/เขียนอะตอมจำนวนเต็มในไฟล์ M4A หมายเหตุ: ใช้ด้วยความระมัดระวัง ฉันต้องการสิ่งนี้ในโครงการหลัก "NEMP" สำหรับอะตอม "TMPO" (aka BPM, เต้นต่อนาที) แต่นี่ไม่ได้ทดสอบอย่างกว้างขวางสำหรับอะตอมอื่น ๆ เอกสารที่ไม่มีประโยชน์มากและมีความไม่สอดคล้องกันบางอย่างเกี่ยวกับจำนวนเต็มที่ลงนาม/ไม่ได้ลงชื่อและขนาดของค่า (8, 16, 24, 32 บิต)
TagType ใน TApeTag.GetUnusedTextTags คือ ttVorbis , ถูกต้องคือ ttApev2
getter และ setter สำหรับ TApeTag.EAN ใช้คีย์ที่แตกต่างกัน
แก้ไขความยุ่งเหยิงด้วยประเภทพระคาร์ดินัล/จำนวนเต็มสำหรับ serialnumber ใน oggpages
ไฟล์ FLAC: ฟังก์ชั่นที่เลิกใช้แล้ว fisvalid ลบ
แก้ไขข้อผิดพลาดในการแยกวิเคราะห์เกี่ยวกับ oggpages และ oggpackets (ซึ่งจริง ๆ แล้วไม่มีผลกระทบต่อไฟล์ OGG/OPUS แต่บนวิธีการใหม่ของ readpackets)
ห้องสมุด Audiowerkzeugebibliothek มีต้นกำเนิดมาจากห้องสมุดเฉพาะรูปแบบหลายรูปแบบสำหรับ MP3, Flag, Ogg และอื่น ๆ ด้วยเหตุนี้จึงมีภาระมากมายในอดีตที่มีอยู่ในรหัส บางรายการที่ซ้ำกันไม่มีความสอดคล้องในลำดับพารามิเตอร์ประเภทหรือการตั้งชื่อและความไม่สะดวกอื่น ๆ
ด้วยเวอร์ชัน 3.0 ฉันพยายามปรับปรุงความสอดคล้องโดยรวมและการใช้งานของวิธีการที่ให้ไว้ อย่างไรก็ตามมันเป็นไปไม่ได้ที่จะทำสิ่งนี้เข้ากันได้
มีการเปลี่ยนแปลงมากมายมากมายและคุณจะต้องทำการเปลี่ยนแปลงที่สอดคล้องกันในรหัสของคุณ
ดู Changelog สำหรับรายละเอียดบางอย่าง
คุณสามารถใช้ไลบรารีนี้ใน "ระดับ" ที่แตกต่างกัน แต่ไม่มีความแตกต่างระหว่างระดับเหล่านี้ คุณสามารถใช้มากขึ้นหรือน้อยลงจากคุณสมบัติของไลบรารีนี้ ขึ้นอยู่กับสิ่งที่คุณต้องการทำขอแนะนำให้ทราบมากขึ้นหรือน้อยลงเกี่ยวกับโครงสร้างภายในของ "ไฟล์เสียง"
TTagItem วัตถุเหล่านี้จำนวนมากมีข้อมูลข้อความ แต่รูปภาพหรือข้อมูลไบนารีอื่น ๆ ก็เป็นไปได้เช่นกันดูตัวอย่างโครงการตัวอย่าง
TBaseAudioFile (หน่วย Audiofiles.base.pas): คลาสนามธรรมที่ประกาศคุณสมบัติพื้นฐานบางอย่างเช่นชื่อ, ศิลปิน, อัลบั้ม, ระยะเวลาและอื่น ๆ ซึ่งจะถูกนำไปใช้ในชั้นเรียน TxxxFile ต่อไปนี้TMP3File , TOggVorbisFile , TFlacFile , ... (หน่วยแยก): คลาสสำหรับหลายประเภทซึ่งใช้วิธีการนามธรรมที่ประกาศใน tbaseaudiofile และอาจกำหนดวิธีการเพิ่มเติม หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับไฟล์คุณอาจต้องเข้าถึงคุณสมบัติและวิธีการของคลาสที่ได้รับเหล่านี้อย่างชัดเจน นอกจากนี้ยังมี "คลาสระดับกลาง" เช่น TBaseApeFile หรือ TBaseVorbisFile สำหรับไฟล์หลายประเภทที่มีความคิดเห็น apev2-tags หรือ vorbisTAudioFileFactory (หน่วย 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 ;ดูตัวอย่าง "DemoExtended" สำหรับรายละเอียด
ในระดับผู้เชี่ยวชาญคุณไม่ได้ใช้ TBaseAudioFile ขั้นพื้นฐานอีกต่อไปที่บ่อยครั้ง แต่คุณทำงานโดยตรงกับคลาสที่ได้รับและคอนเทนเนอร์ข้อมูลเมตาเฉพาะ
เนื่องจากสิ่งนี้ช่วยให้คุณสามารถเข้าถึงไฟล์และโครงสร้างภายในของพวกเขาได้ขั้นพื้นฐานคุณสามารถทำเรื่องไร้สาระมากมายกับพวกเขาซึ่งอาจนำไปสู่ปัญหากับโปรแกรมอื่น ๆ ไม่ว่าจะเป็นเพราะคุณไม่ปฏิบัติตามมาตรฐานที่บันทึกไว้หรือเพราะคุณทำลายกฎที่ไม่เป็นทางการโดยทั่วไป การเขียนแท็ก ID3v2 ในไฟล์ OGG เป็นไปได้ แต่ก็ไม่ใช่ความคิดที่ดี ไม่ได้เขียนความคิดเห็น vorbis ไปยังไฟล์ mp3
ใช้ตัวเลือกที่ได้รับความระมัดระวัง - โดยเฉพาะอย่างยิ่งกับการเข้าถึงการเขียน
ดูการสาธิต "Demomp3" สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่เป็นไปได้ (แต่ไม่แนะนำเสมอไปผู้เล่นบางคนอาจสะดุดเกี่ยวกับไฟล์เหล่านี้)
รูปแบบเสียงหลายรูปแบบอาจมีข้อมูลเมตาหลายชนิดภายในไฟล์ ห้องสมุดนี้ใช้สมมติฐานต่อไปนี้
ไฟล์ MP3 มักจะมี ID3V1 และ ID3V2-tags เมื่อใช้คลาส TMP3File คลาสมักจะทำให้มั่นใจได้ว่าทั้งสองเวอร์ชันยังคงสอดคล้องกันในไฟล์
ไฟล์ MP3 บางครั้งก็มี APEV2-TAG แท็กนี้ยังได้รับการประมวลผลอย่างสมบูรณ์โดยคลาส TMP3File การตั้งค่าคุณสมบัติพื้นฐานจะทำให้มั่นใจได้ว่าแท็กเมตาทั้งหมดยังคงสอดคล้องกัน ตรวจสอบให้แน่ใจว่า Property TagsToBeWritten มี mt_Existing (ซึ่งเป็นค่าเริ่มต้น)
ไม่มีคีย์มาตรฐานที่กำหนดไว้สำหรับ "เนื้อเพลง" ในความคิดเห็นของ Vorbis และแท็ก ApeV2 จากการวิจัยของฉันมีการใช้งานต่อไปนี้: UNSYNCEDLYRICS , UNSYNCED LYRICS (พร้อมพื้นที่) และ LYRICS คีย์ทั้งสามนี้ถูกนำมาพิจารณาเมื่ออ่าน 'เนื้อเพลง' เมื่อเขียนคีย์ที่มีอยู่จะถูกใช้ หากไม่มีตัวแปรสามตัวเลือกชุดคีย์ในตัวแปรส่วนกลาง AWB_DefaultLyricsKey ที่ใช้ ค่าเริ่มต้นคือ UNSYNCEDLYRICS
รูปแบบเสียงทั้งหมดที่ใช้ ApeV2-tags โดยค่าเริ่มต้น (Monkey, Wavpack, Musepack, OptimFrog, TrueAudio) อาจมี ID3V1- และ ID3V2-tags คลาส TxxxFile สำหรับรูปแบบเหล่านั้นจะดำเนินการอย่างเต็มที่กับ ID3V1-TAG ตรวจพบการมีอยู่ของ ID3v2-tag (และขนาดของมันถูกพิจารณาสำหรับการคำนวณระยะเวลาถ้าจำเป็น) แต่ไม่ถูกละเว้น
สำหรับไฟล์ MP3 และไฟล์ที่ใช้ APE คุณสามารถใช้คุณสมบัติ TagsToBeWritten , TagsToBeDeleted และ DefaultTags เพื่อตัดสินใจว่าแท็ก meta ใดที่ถูกเขียน/ลบเข้า/ออกจากไฟล์เมื่อใช้วิธี 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 ก่อน เมตาแท็กนี้มีความซับซ้อนมากขึ้น แต่จำเป็นต้องอ่านต่อไปเพื่อไปยังข้อมูลเมตาเสียงเช่นบิตเรตระยะเวลาและสิ่งอื่น ๆ ในโหมดอัจฉริยะ ID3V1-TAG จะอ่านได้จากไฟล์เท่านั้นหากไม่มี ID3v2-tag ที่เหมาะสมที่มีศิลปินชื่ออัลบั้มแทร็กปีและประเภท หากคุณต้องการฟิลด์ "ความคิดเห็น" ให้ตั้งค่า fSmartRead_IgnoreComment เป็น False
หากคุณเปลี่ยนคุณสมบัติเหล่านี้อย่างใดอย่างหนึ่งผ่านตัวตั้งค่าของคลาส TMP3File คุณสมบัติ fSmartRead_AvoidInconsistentData (ค่าเริ่ม TagWriteMode : True ) จะ UpdateFile มั่นใจได้ว่า ID3v1-tag จะถูกประมวลผลอย่างถูกต้อง
หมายเหตุ: สำหรับไฟล์ที่ใช้ลิงไม่จำเป็นต้องใช้ การตรวจจับ tags ape มักจะต้องมีการตรวจสอบ (และอ่าน) ID3V1-tags เช่นกันดังนั้นจึงไม่มีการเร่งความเร็วอย่างมีนัยสำคัญ
โดยปกติแล้วไฟล์ MP3 ที่เข้ารหัสด้วยตัวแปรบิตเรตจะมีการเรียกว่า Xing-Header (หรือสิ่งที่คล้ายกัน) ที่มีข้อมูลเพิ่มเติมที่จำเป็นสำหรับการคำนวณระยะเวลาของไฟล์อย่างรวดเร็ว เมื่อเร็ว ๆ นี้ฉันพบไฟล์บางไฟล์ที่ไม่มีหัว Xing ดังกล่าวส่งผลให้ระยะเวลาที่คำนวณได้นานขึ้นและวิธีที่ต่ำเกินไป (เช่น 32 kbit/s) นี่ ไม่ใช่ ปัญหาสำหรับห้องสมุดนี้เท่านั้น แต่ยังคง มีไว้ สำหรับห้องสมุดอื่น ๆ อีกมากมาย
สำหรับไฟล์ดังกล่าวได้มีการแนะนำคุณสมบัติใหม่ TMP3File.MpegScanMode ค่าที่เป็นไปได้คือ
TMpegScanMode = (MPEG_SCAN_Fast, MPEG_SCAN_Smart, MPEG_SCAN_Complete);MPEG_SCAN_Fast สแกนไฟล์เหมือนเมื่อก่อนโดยสุจริตว่าไฟล์ VBR มีหัวหน้า Xing (หรือสิ่งที่เทียบเท่า) สิ่งนี้ใช้งานได้ดีมากในกรณีส่วนใหญ่MPEG_SCAN_Smart ตรวจสอบว่าผลลัพธ์จากการสแกนที่รวดเร็วนั้นสมเหตุสมผลหรือไม่ หากบิตเรตที่คำนวณได้คือ 32 kbit/s (หรือต่ำกว่าซึ่งจะไม่ถูกต้องจริง) อาจมีบางอย่างผิดปกติ ดังนั้นไฟล์จะถูกประมวลผลอย่างสมบูรณ์สแกนแต่ละเฟรม MPEG โปรดทราบว่าไฟล์ MP3 ส่วนใหญ่เริ่มต้นด้วยช่วงเวลาแห่งความเงียบ ตัวเข้ารหัสที่ตั้งค่าเป็น "VBR" น่าจะใช้พื้นที่ขั้นต่ำที่เป็นไปได้ในการเข้ารหัสสิ่งนี้ - ซึ่งก็คือ 32kbit/sMPEG_SCAN_Complete เสมอไฟล์ที่สมบูรณ์ สิ่งนี้นำไปสู่ระยะเวลาที่แม่นยำที่สุด แต่ก็ต้องใช้เวลามากขึ้น โหมดเริ่มต้นคือ MPEG_SCAN_Smart
ห้องสมุดนี้ควรทำงานกับ Delphi ทุกรุ่นตั้งแต่ Delphi 7 ถึง Delphi 12 อย่างไรก็ตามมีบางสิ่งที่ต้องคำนึงถึงรุ่นเก่าโดยไม่ต้องรองรับ Unicode ในตัว (= ก่อน Delphi 2009)
หมายเหตุ : ฉันใช้ "Unicode" ที่นี่ในความหมายของ "มากกว่า ANSI" นั่นไม่ถูกต้อง 100% แต่ฉันหวังว่าคุณจะรู้ว่าฉันกำลังพูดอะไร -
ก่อนที่ Delphi 2009 VCL เป็นเพียง ANSI-ONLY และไม่สนับสนุน Unicode ซึ่งรวมถึงการแสดงผลของสตริงที่มีอักขระ Unicode และการเปิดไฟล์ด้วยอักขระ Unicode ในชื่อไฟล์ สำหรับสิ่งนั้นมีการรวบรวมส่วนประกอบที่เรียกว่า "tntunicodecontrols" คอลเลกชันรุ่นเก่านี้มีอยู่ภายใต้ใบอนุญาตครีเอทีฟคอมมอนส์และควรจะพบที่ไหนสักแห่ง
ไลบรารีนี้สามารถใช้ประโยชน์จากการควบคุมเหล่านี้ได้โดยการเปิดใช้งานสวิตช์คอมไพเลอร์ในไฟล์ config.inc เพียงแค่ลบ "." ในบรรทัด {.$DEFINE USE_TNT_COMPOS}
ภายในห้องสมุดเอง TNT จะใช้สำหรับคลาส TNTFileStream แน่นอนว่าคุณสามารถใช้คลาส FileStream ที่มีความสามารถของ Unicode อื่น ๆ ได้เช่นกัน เพียงปรับบรรทัดของรหัสเหล่านี้ตามความต้องการของคุณ: (ไฟล์: audiofiles.declarations.pas)
{ $IFDEF USE_TNT_COMPOS }
TAudioFileStream = TTNTFileStream;
{ $ELSE }
TAudioFileStream = TFileStream;
{ $ENDIF }หากคุณใช้เวอร์ชัน Delphi รุ่นเก่าที่ไม่มี tntunicodecontrols ไลบรารีนี้จะยังคงทำงานได้ แต่คุณไม่สามารถเปิดไฟล์ที่มีชื่อไฟล์เช่น "จักรพรรณ์อาบครบุรี - 10 เท่านี้ก็ตรม. mp3" เมื่อคุณพยายามที่จะแสดงข้อมูลเกี่ยวกับชื่อเรื่องและศิลปินจากไฟล์ดังกล่าว (หลังจากเปลี่ยนชื่อ) คุณจะเห็นเพียง "?????" แทนที่จะเป็นชื่อจริง โปรดทราบว่าการเขียนแท็กเมตาใหม่ภายใต้เงื่อนไขดังกล่าวอาจนำไปสู่การสูญเสียข้อมูล
หมายเหตุ : โครงการตัวอย่างไม่ได้ใช้ tntcontrols (เช่น ttntedit แทน tedit) ระวังที่นั่นกับ Delphis ที่มีอายุมากกว่า -
รุ่นใหม่ Delphi (2009 และใหม่กว่า) มีการสนับสนุน Unicode ในตัวและดังนั้นจึงไม่จำเป็นต้องใช้ tntunicodecontrols เหล่านี้ นอกจากนี้คำจำกัดความของประเภท UnicodeString ไม่จำเป็นต้องมี นี่คือเหตุผลสำหรับสวิตช์คอมไพเลอร์นี้:
{$IFNDEF UNICODE}
UnicodeString = WideString;
{$ENDIF}
ในเวอร์ชัน 2.0 ของไลบรารีนี้ฉันใช้รูปแบบโรงงานสำหรับเสียงประเภทต่าง ๆ คลาสสำหรับรูปแบบไฟล์เสียงเฉพาะได้ลงทะเบียนในคลาสโรงงาน สำหรับการจัดการคลาสที่ลงทะเบียนทั้งหมดคลาสโรงงานจะใช้ tdictionary โดยค่าเริ่มต้น หากเวอร์ชัน Delphi ของคุณไม่รองรับ tdictionary ให้ยกเลิกการใช้งานใน confic.inc ในกรณีนั้นจะมีการใช้งาน tobjectList ปกติสำหรับสิ่งนั้น
{$DEFINE USE_DICTIONARY}
เพื่อเพิ่มความเร็วในการเข้าถึงใน TobjectList จะถูกนำไปใช้เป็นรายการการจัดระเบียบตนเองโดยใช้ "วิธีการเปลี่ยนตำแหน่ง" หากไฟล์เสียงที่มีส่วนขยายชื่อไฟล์เฉพาะถูกสร้างขึ้นผ่านโรงงานส่วนขยาย/คลาสนี้จะถูกเลื่อนขึ้นไปในรายการลดเวลาในการค้นหาอีกครั้ง
ไลบรารีนี้ควรอ่านข้อมูลจากไฟล์เสียงทุกประเภทอย่างถูกต้องในกรณีส่วนใหญ่ อย่างไรก็ตามมีไฟล์เสียงแปลก ๆ "ใน wild" โดยใช้วิธีการหรือตัวแปรที่ไม่ได้รับการจัดการอย่างเหมาะสมโดยไลบรารีนี้ ฉันคิดว่าหลังจากผ่านไปหลายปีฉันกำลังรับมือกับเกือบทุกอย่างในตอนนี้ แต่อาจมีบางกรณีที่หายากที่ฉันหายไป
หากคุณพบข้อผิดพลาดหรือหากคุณมีไฟล์เสียง (โดยเฉพาะไฟล์ MP3!) ที่วิธีการของไลบรารีนี้ให้ข้อมูลที่ไม่ถูกต้องโปรดติดต่อฉันและ/หรือส่งไฟล์ตัวอย่างไปที่ [email protected]
แต่ฉันไม่สามารถแก้ไขทุกอย่างได้ สิ่งที่บ้าที่สุดที่ฉันเคยเห็นคือ ID3V2TAG ที่มีการเข้ารหัสต่อไปนี้: UTF-16 (ดี), Null-Terminated (มาตรฐานมากหรือน้อย) เริ่มต้นด้วย BOM (ตกลง ... ), ตัวละครโดยตัวละคร (WTF ... ?)-ใช่ไม่มีการล้อเล่น รวม 6 ไบต์ต่อตัวละคร ...