2011-06-20 12 views
0

私はid3フレームを読み込もうとしていますが、私の問題は完全なタイトルを得ることができないことです。 mp3のタイトルが長い場合、私の結果は終わりのない文字列で、最初の9文字は含まれません。曲のタイトルが短い場合、私の結果は最初の9文字のないタイトルです。id3v2のフレームを読むにはどうすればよいですか?

struct ID3V2frame 
{ 
    char header[4]; 
    char *id3frame[readBytes]; 
    int sizze[4]; 
}frame; 

fseek(file,10,SEEK_SET); // skip id3 header 

fread(&frame.header,sizeof(frame),1,file); 


readBytes = ((frame.sizze[0] & 127) << 21) | 
((frame.sizze[1] & 127) << 14) | 
((frame.sizze[2] & 127) << 7) | 
(frame.sizze[3] & 127); 

fread(&frame.id3frame,sizeof(frame),1,file); 
if(strncmp(frame.header,"TIT2", 4) == 0) 
    printf("%s",frame.id3frame); 

答えて

0

私はsizeof(struct ID3V2frame)が返されますので、何か問題がある知っている:

sizeof(char[4]) + sizeof(char pointer) + sizeof(int[4]) 

注意を、構造体がcharへのポインタを持っており、ポインタはおそらくあなたのシステムでは4バイトであること。だからあなたは間違ったサイズで、間違った方法でfread()しています。

ID3についてはわかりませんが、ヘッダーのどこかにこの文字列のサイズを指定する必要があります。

編集:DOC

ID3v2のフレームの概要を読む

タグは、1つ以上の フレームにタグ・ヘッダ とタグ本体から構成されるように、すべてのフレームが フレームで構成されフィールドに実際の 情報を含む1つまたは複数の フィールドが続きます。

フレームIDの$ XX XX XX XX(4文字)

サイズ$ XX XX XX XX

フラグ$ XX XX

フレームIDが続いている:フレーム ヘッダのレイアウトサイズが の記述子で置き換えられ、すべてのフレームで合計ヘッダーサイズが10バイトの になります。サイズ は、 フレームヘッダー(フレームサイズ-10)を除いたフレームサイズとして計算されます。

フレーム構造が正しくありません。

構造体を固定して、適切な合計をsizeに設定した後は、fread()size-10バイトを使用してフレームの内容を取得できます。

Frame IDを確認する必要があるため、タイトルには任意の順序で指定できるため、タイトルのファイル名フレームであるかどうかを確認する必要があるので注意してください。

ドキュメントを参照してください。 ID3v2は十分に文書化されているようです。私は5分ですべての情報を得ることができました。

http://www.id3.org/id3v2.3.0

+0

はい!その通り!! – andrey

+0

それはあなたを助けてうれし:)とにかく、あなたはid3libを試してみましたか? http://id3lib.sourceforge.net/成熟して広く使われているコードと思われます。 –

関連する問題