2

ファイルからmp3ヘッダーを抽出しようとしています。これはID3タグとは異なります。mp3ヘッダーには、MPEGバージョン、ビットレート、周波数などに関する情報が保持されます。

ここでmp3ヘッダー構造の概要を見ることができます:http://upload.wikimedia.org/wikipedia/commons/0/01/Mp3filestructure.svg

私の問題は、ファイルをロードし、有効な(私が知る限り)バイナリ出力を受け取っているにもかかわらず、期待される値が表示されないことです。mp3同期ワードの場合、mp3ファイルの最初の12ビットはすべて1である必要があります。ただし、最初の8ビットだけで何か違うものを受け取っています。これは私に問題を示唆するでしょう。

ちなみに、有効なmp3ファイルがfopen経由で添付されています

// Main function
int main (void)
{
    // Declare variables
    FILE *mp3file;
    char requestedFile[255] = "";
    unsigned long fileLength;

    // Counters
    int i;

    // Tryout
    unsigned char byte; // Read from file
    unsigned char mask = 1; // Bit mask
    unsigned char bits[8];

    // Memory allocation with malloc
    // Ignore this at the moment! Will be used in the future
    //mp3syncword=(unsigned int *)malloc(20000);

    // Let's get the name of the file thats requested
    strcpy(requestedFile,"testmp3.mp3"); // lets hardcode this into here for now

    // Open the file
    mp3file = fopen(requestedFile, "rb"); // open the requested file with mode read, binary
    if (!mp3file){
        printf("Not found!"); // if we can't find the file, notify the user of the problem
    }

    // Let's get some header data from the file
    fseek(mp3file,0,SEEK_SET);
    fread(&byte,sizeof(byte),1,mp3file);

    // Extract the bits
    for (int i = 0; i < sizeof(bits); i++) {
        bits[i] = (byte >> i) & mask;
    }

    // For debug purposes, lets print the received data
    for (int i = 0; i < sizeof(bits); i++) {
        printf("Bit: %d\n",bits[i]);
    }
4

6 に答える 6

2

ID3v2は、MP3ファイルが存在する場合、その最初のビットを占有します。ファイルの最初の3バイトは「ID3」になります。

http://www.id3.org/id3v2.4.0-構造

それに対処する2つの方法があります。1つ目は、ID3タグの存在を確認し、次に10バイトのヘッダーを解析してタグサイズを確認し、その数のバイトをスキップします。

編集:ヘッダーを解析する場合は、フラグフィールドの4番目のビットが1に設定されているかどうかを確認する必要があります。設定されている場合は、フッターを通過するためにさらに10バイトをスキップする必要があります。

または、同期パターンに達するまでMP3を検索することもできます。ID3v2の設定方法では、ID3v2をサポートしていないプレーヤーとの互換性を確保するために、11ビットが連続して発生しないようにする必要があります。

于 2009-11-05T20:46:51.133 に答える
1
fseek(mp3file,1,SEEK_SET);

ファイルの最初のバイトをスキップする理由はありますか?

于 2009-11-05T20:24:21.007 に答える
1

試す

fseek(mp3file,0,SEEK_SET)

それ以外の

fseek(mp3file,1,SEEK_SET).

ファイルはバイト位置0から始まります。

于 2009-11-05T20:25:05.887 に答える
1

私はあなたがおそらく欲しいと思います

fseek(mp3file,0,SEEK_SET);
于 2009-11-05T20:25:11.223 に答える
1

ID3情報が最初に来る場合があります。最初の3文字はありID3ますか?

于 2009-11-05T20:30:51.680 に答える
0

fseek(mp3file,1,SEEK_SET);最初の8ビットをスキップするので、freadで得られるのはビット9から16です。

于 2009-11-05T20:26:28.683 に答える