오디오 파일 용 델파이 라이브러리.
다양한 오디오 형식에서 메타 태그 (예술가, 제목, 앨범, 장르, ...)를 읽고 쓰고 오디오 파일에 대한 정보를 수집하십시오 (예 : 기간, 비트 레이트, 샘플 리테이션). AudiowerKzeugebibliothek은 기본 정보에 대한 매우 간단한 사용법을 제공하지만 거의 모든 종류의 메타 데이터에 대한 심층적 인 액세스를위한 강력한 기능도 포함되어 있습니다.
지원되는 태그 형식 ( Bold : v3.0의 새로운 ) :
제한 사항 :
속성 TTagItem.DataSize .
TID3v2Tag.GetUnusedTextTags 에 URL 프레임 및 댓글을 추가했습니다.
메소드 TOggContainer.ReadPackets(Target: TObjectList) OggStream에서 모든 패킷을 가져옵니다.
속성 TOpusFile.VBR (거의 모든 경우에 True 이어야 함) *
M4A 파일에서 정수 원자를 읽고 쓰는 방법. 참고 :주의해서 사용하십시오. "TMPO"원자 (일명 BPM, 분당 비트)에 대한 주요 프로젝트 "NEMP"에서 이것을 필요로하지만 다른 원자에 대해 널리 테스트되지는 않습니다. 문서는 그다지 도움이되지 않으며 서명/부호없는 정수와 값의 크기 (8, 16, 24, 32 비트)와 관련하여 불일치가 있습니다.
TApeTag.GetUnusedTextTags 의 tagtype는 ttVorbis 이고, 올바른 것은 ttApev2 입니다.
TApeTag.EAN 의 Getter and Setter는 다른 키를 사용했습니다.
OggPages에서 SerialNumber의 추기경/정수 유형으로 혼란을 수정했습니다.
FLAC 파일 : 삭제 된 감가 상각 된 기능 fisvalid
OGGPAGE 및 OGGPACKETS (실제로 OGG/OPUS 파일에 영향을 미치지 않았지만 새로운 메소드 readPackets에 영향을 미치지 않음)에 대한 구문 분석 오류를 수정했습니다.
도서관 AudiowerKzeugebibliothek은 MP3, Flag, OGG 등의 여러 형식 별 라이브러리에서 비롯되었습니다. 그로 인해 코드에 포함 된 과거에는 많은 부담이있었습니다. 일부 복제, 매개 변수 순서, 유형 또는 명명 및 기타 불편 함의 일관성이 없습니다.
버전 3.0을 사용하면 제공된 방법의 전반적인 일관성과 유용성을 향상 시키려고 노력합니다. 그러나 이것을 하향 호환하는 것은 불가능합니다.
많은 변경 사항이 있으며 코드를 변경해야합니다.
자세한 내용은 changelog를 참조하십시오.
이 라이브러리는 다른 "레벨"에서 사용할 수 있지만 이러한 레벨 간에는 실제 차별화가 없습니다. 이 라이브러리의 기능에서 다소 사용할 수 있습니다. 원하는 일에 따라 "오디오 파일"의 내부 구조에 대해 다소 아는 것이 좋습니다.
TTagItem 클래스의 객체입니다. 이러한 객체 중 다수에는 텍스트 정보가 포함되어 있지만 이미지 또는 기타 이진 데이터도 가능합니다.예제는 데모 프로젝트를 참조하십시오.
TBaseAudioFile (unit audiofiles.base.pas) : 제목, 아티스트, 앨범, 기간 및 기타와 같은 일부 기본 속성을 선언하는 추상 클래스는 다음 TxxxFile 클래스에서 구현됩니다.TMP3File , TOggVorbisFile , TFlacFile , ... (Seperate Units) : tbaseaudiofile에서 선언 된 추상 메소드를 구현하고 몇 가지 방법을 정의 할 수있는 여러 파일 유형에 대한 클래스. 파일에 대한 자세한 정보를 원한다면 이러한 파생 클래스의 속성 및 방법에 명시 적으로 액세스해야 할 수도 있습니다. APEV2-TAG 또는 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 를 자동으로 처리합니다.
자세한 내용은 Demo "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 와 같은 다양한 형식 별 유형, APEV2 용 tctExternal 또는 M4A 파일의 경우 tctGenre 있습니다. 이러한 유형 중 일부의 경우 내부 구조가 다르고 별도로 처리해야하더라도 텍스트로 간주하는 것이 합리적입니다. 텍스트 모드 매개 변수는이 목적으로 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- 태그도 포함됩니다. 이 태그는 이제 클래스 TMP3File 에 의해 완전히 처리됩니다. 기본 속성을 설정하면 모든 메타 태그가 일관성이 유지됩니다. 속성 TagsToBeWritten 에 mt_Existing (기본값)이 포함되어 있는지 확인하십시오.
Vorbis 주석 및 APEV2 태그에는 "가사"에 대해 표준 키가 정의되지 않습니다. 내 연구에 따르면, 다음의 변형이 사용되고 있습니다 : UNSYNCEDLYRICS , UNSYNCED LYRICS (공간 포함) 및 LYRICS . 이 세 가지 키는 '가사'를 읽을 때 고려됩니다. 쓸 때 기존 키가 사용됩니다. 세 가지 변형 중 어느 것도 사용할 수 없으면 글로벌 변수 AWB_DefaultLyricsKey 의 키 세트가 사용됩니다. 기본값은 UNSYNCEDLYRICS 입니다.
기본적으로 APEV2- 태그를 사용하는 모든 오디오 형식 (원숭이, Wavpack, Musepack, Optimfrog, Trueaudio)에는 ID3V1 및 ID3V2-TAG가 포함될 수 있습니다. 이러한 형식의 TxxxFile 클래스는 이제 ID3V1- 태그를 완전히 처리합니다. 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- 태그에서 오는지 상관하지 않습니다. 스캔 속도를 높이기 위해 (적어도 이것은 희망입니다) 속성 TagScanMode 소개됩니다. 가능한 값이 있습니다
TTagScanMode = (id3_read_complete, id3_read_smart, id3_read_v2_only ); 기본값은 id3_read_complete 이며 모든 포함 된 태그가 처리됩니다. 옵션 id3_read_smart 옵션이 ID3V2- 태그를 먼저 확인합니다. 이 메타 태그는 더 복잡하지만 Bitrate, 지속 시간 및 기타 물건과 같은 오디오 메타 데이터에 도달하려면 어쨌든 읽어야합니다. 스마트 모드에서 ID3V1- 태그는 아티스트, 제목, 앨범, 트랙, 연도 및 장르를 포함하는 적절한 ID3V2- 태그가없는 경우 파일에서만 읽습니다. "댓글"필드도 포함하려면 fSmartRead_IgnoreComment False 로 설정하십시오.
클래스 TMP3File 세터를 통해 이러한 속성 중 하나를 변경하면 속성 fSmartRead_AvoidInconsistentData (DEFAULT : True )는 ID3V1-TAG도 올바르게 처리되도록 보장하므로 UpdateFile ID3V1 및 ID3V2-TAG를 일관된 데이터로 작성합니다 ( TagWriteMode 의 설정에 따라).
참고 : APE 기반 파일의 경우 필요하지 않습니다. Ape-Tags를 감지하려면 항상 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 빠른 스캔 결과가 의미가 있는지 확인합니다. 계산 된 비트 전송률이 32kbit/s (또는 더 낮은 것, 실제로 유효하지 않음)라면 아마도 뭔가 잘못 될 수 있습니다. 따라서 파일은 완전히 처리되어 각 MPEG 프레임마다 스캔합니다. 대부분의 MP3 파일은 약간의 침묵으로 시작합니다. "VBR"으로 설정된 인코더는 가능한 최소의 공간을 사용하여이를 인코딩하여 32kbit/s입니다.MPEG_SCAN_Complete 항상 완전한 파일입니다. 이것은 가장 정확한 지속 시간으로 이어지지 만 훨씬 더 많은 시간이 필요합니다. 기본 모드는 MPEG_SCAN_Smart 입니다.
이 라이브러리는 Delphi 7 에서 Delphi 12 까지 모든 Delphi 버전과 함께 작동해야합니다. 그러나 내장 유니 코드 지원이없는 이전 버전으로 명심해야 할 사항이 있습니다 (= Delphi 2009 이전).
참고 : 여기에서 "유니 코드"를 사용하여 "ANSI 이상"의 의미로 사용합니다. 그것은 100% 정확하지는 않지만 내가 무슨 말을하는지 알기를 바랍니다. ;-)
Delphi 2009 이전에 VCL은 ansi-only였으며 유니 코드를 지원하지 않았습니다. 여기에는 유니 코드 문자가있는 문자열 표시와 파일 이름에 유니 코드 문자가있는 파일 열기가 포함됩니다. 이를 위해 "tntunicodecontrols"라는 구성 요소 모음이있었습니다. 이 컬렉션의 이전 버전은 Creative Commons 라이센스로 제공되었으며 여전히 어딘가에 있습니다.
이 라이브러리는 파일 config.inc 에서 컴파일러 스위치를 활성화하여 이러한 컨트롤을 사용할 수 있습니다. ""만 제거하십시오. 라인에서 {.$DEFINE USE_TNT_COMPOS} .
라이브러리 자체 내에서 TNT는 클래스 TNTFileStream 에 사용됩니다. 물론 다른 유니 코드 유능한 파일 스트림 클래스도 사용할 수 있습니다. 필요에 따라 이러한 코드 라인을 조정합니다. (파일 : 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에서는 다양한 유형의 오디오 필에 대한 공장 패턴을 사용합니다. 특정 오디오 파일 형식에 대한 클래스는 공장 클래스에 등록되어 있습니다. 등록 된 모든 클래스를 관리하기 위해 Factory Class는 기본적으로 tdictionary를 사용합니다. Delphi 버전이 tdictionary를 지원하지 않으면 confic.inc 에서 사용량을 정의하지 마십시오. 이 경우 정기적 인 TobjectList가 사용됩니다.
{$DEFINE USE_DICTIONARY}
TobjectList의 액세스 속도를 높이려면 "Transpose Method"를 사용하여 자체 구성 목록으로 구현됩니다. 특정 파일 이름 확장 기능이있는 오디오 파일이 공장을 통해 생성되면이 확장/클래스가 목록에서 위쪽으로 이동하여 다시 찾을 시간이 줄어 듭니다.
이 라이브러리는 대부분의 경우 모든 종류의 오디오 파일의 정보를 올바르게 읽어야합니다. 그러나이 라이브러리에서 제대로 처리되지 않은 메소드 또는 변형을 사용하여 "야생의"이상한 오디오 파일이 있습니다. 나는 심각한 몇 년이 지난 후에 나는 지금 거의 모든 것에 대처하고 있다고 생각하지만, 내가 누락 된 드문 경우가 여전히있을 수 있다고 생각합니다.
버그를 발견했거나 오디오 파일 (특히 MP3 파일)이있는 경우이 라이브러리의 메소드가 잘못된 데이터를 제공하는 경우 저에게 연락하거나 샘플 파일을 [email protected]로 보내십시오.
그러나 나는 모든 것을 고칠 수는없고하지 않을 것입니다. 내가 본 것 중 가장 미친 점은 다음과 같은 인코딩이있는 ID3V2TAG입니다. UTF-16 (Fine), Null-Terminated (다소 표준), BOM (OK ...), 문자 별 문자 (WTF ...?)-예, 농담이 아닙니다. 문자 당 총 6 바이트 ...