ADD: Read some mp4 tags

This commit is contained in:
Alexander Koblov 2016-04-24 07:40:12 +00:00
commit 3b9d6412cb
2 changed files with 58 additions and 6 deletions

View file

@ -47,18 +47,23 @@ type
FSampleRate: LongWord;
private
FYear,
FGenre,
FTitle,
FAlbum,
FArtist,
FEncoder,
FComment,
FComposer: String;
FComposer,
FCopyright: String;
FTrack: LongWord;
protected
procedure ResetData;
procedure ReadMovieHeader;
procedure ReadMetaDataItemList;
procedure ReadSampleDescription;
function ReadAtomData: String; overload;
function ReadAtomData: String;
function ReadGenreData: String;
function ReadTrackData: LongWord;
function FindAtomHeader(const AName: TAtomName; ASize: PInt64 = nil): Boolean;
function LoadAtomHeader(out AtomName: TAtomName; out AtomSize: Int64): Boolean;
public
@ -71,17 +76,23 @@ type
property BitRate: Double read FBitRate; { Bit rate (bit/s) }
property Duration: Double read FDuration; { Duration (seconds) }
property Year: String read FYear; { Release year }
property Genre: String read FGenre; { Genre name }
property Track: LongWord read FTrack; { Track number }
property Title: String read FTitle; { Song title }
property Artist: String read FArtist; { Artist name }
property Album: String read FAlbum; { Album title }
property Artist: String read FArtist; { Artist name }
property Comment: String read FComment; { Comment }
property Encoder: String read FEncoder; { Encoder }
property Composer: String read FComposer; { Composer }
property Copyright: String read FCopyright; { Copyright }
property Valid: Boolean read GetValid; { True if data valid }
end;
implementation
uses
ID3v1;
{ TMP4file }
function TMP4file.FindAtomHeader(const AName: TAtomName; ASize: PInt64): Boolean;
@ -113,7 +124,7 @@ end;
function TMP4file.LoadAtomHeader(out AtomName: TAtomName; out AtomSize: Int64): Boolean;
begin
AtomSize:= SwapEndian(FStream.ReadDWord);
FillChar(AtomName, SizeOf(TAtomName), #0);
FillChar({%H-}AtomName, SizeOf(TAtomName), #0);
FStream.Read(AtomName, SizeOf(TAtomName));
if AtomSize <> 1 then
AtomSize:= AtomSize - 8
@ -184,12 +195,42 @@ begin
if DataType = 1 then
begin
FStream.Seek(4, soCurrent);
FStream.Read(Buffer, AtomSize - 8);
FStream.Read({%H-}Buffer, AtomSize - 8);
SetString(Result, Buffer, AtomSize - 8);
end;
end;
end;
function TMP4file.ReadGenreData: String;
var
AGenre: Word;
AtomSize: Int64;
begin
Result:= EmptyStr;
if FindAtomHeader('data', @AtomSize) then
begin
FStream.Seek(8, soCurrent);
AGenre:= SwapEndian(FStream.ReadWord);
FStream.Seek(AtomSize - 10, soCurrent);
end;
if (AGenre > 0) and (AGenre < MAX_MUSIC_GENRES) then
begin
Result:= aTAG_MusicGenre[AGenre - 1];
end;
end;
function TMP4file.ReadTrackData: LongWord;
var
AtomSize: Int64;
begin
if FindAtomHeader('data', @AtomSize) then
begin
FStream.Seek(8, soCurrent);
Result:= SwapEndian(FStream.ReadDWord);
FStream.Seek(AtomSize - 12, soCurrent);
end;
end;
procedure TMP4file.ReadMetaDataItemList;
var
AtomSize: Int64;
@ -209,7 +250,13 @@ begin
while FStream.Position < AtomFinish do
begin
LoadAtomHeader(AtomName, AtomSize);
if SameText(#169'art', AtomName) then
if SameText('trkn', AtomName) then
FTrack:= ReadTrackData
else if SameText('gnre', AtomName) then
FGenre:= ReadGenreData
else if SameText('cprt', AtomName) then
FCopyright:= ReadAtomData
else if SameText(#169'art', AtomName) then
FArtist:= ReadAtomData
else if SameText(#169'alb', AtomName) then
FAlbum:= ReadAtomData
@ -223,6 +270,8 @@ begin
FEncoder:= ReadAtomData
else if SameText(#169'wrt', AtomName) then
FComposer:= ReadAtomData
else if SameText(#169'gen', AtomName) then
FGenre:= ReadAtomData
else FStream.Seek(AtomSize, soCurrent);
end;
end;

View file

@ -312,12 +312,15 @@ begin
Channels:= FormatChannels(FMP4file.Channels);
Date:= FMP4file.Year;
Track:= FMP4file.Track;
Genre:= FMP4file.Genre;
Title:= FMP4file.Title;
Album:= FMP4file.Album;
Artist:= FMP4file.Artist;
Comment:= FMP4file.Comment;
Encoder:= FMP4file.Encoder;
Composer:= FMP4file.Composer;
Copyright:= FMP4file.Copyright;
end;
end;