-1

MP3 ファイルを解析し、可変ビット レート (VBR) MP3 ファイル内のすべてのフレームを検出しようとしています。インターネット全体を調べましたが、新しいフレーム ヘッダーの同期を検出するための適切なソリューションが見つかりませんでした。他の投稿から、FFEまたはFFFを探す必要があると書かれていますが、私のプログラムでは正しく検出されません。FFF または FFE を探す方法がわかりません。FFE を 0xF として取得し、次のバイトを 0xFE として取得しますが、必要な 11 ビットの 1 を構築するためにこれから FFF を取得するにはどうすればよいですか? MP3参照の場所として他のすべてのトピックとWebサイトにリンクされているこれとそのソースコードを調べましたが、私の質問をカバーする部分は、ソースに記載されていないCMPA *ファイルにあると思いますコード ダウンロード.

do 
    {
        uiFrame = getc(pFile);
        if(EOF == uiFrame)
            break;
        cntSize++;
        if(0xFF == uiFrame)
        {
            uiFrame = getc(pFile);
            if(EOF == uiFrame)
                break;
            if((0xE == uiFrame) )//|| (0xE0 == uiFrame))
            {
                if(1 != uiFrameCount)
                    printf("\nFrame Size is %d \n\n",cntSize - PrevoiusFrameSize);

                printf("\nFrame Found at Byte %d", cntSize);
                PrevoiusFrameSize = cntSize;
                CheckFlag         = 1;
                uiFrameCount++;
            }
            cntSize++;
        }
    }while(1 != CheckFlag);

上記のコードまたは考えられるその変形を実行すると、1〜6フレームが得られますが、上記のリンクからプログラム自体を使用すると、テストmp3ファイルで8855フレームと表示されます。答えを探すためのアイデアやGoogleのページが不足しているため、この問題に関する助けをいただければ幸いです。

ご協力ありがとうございました。

編集: Marc BI からの迅速な返信の後、問題はほとんど理解されましたが、彼の回答を反映するように編集した後、1 つから 4 つのフレームのみを検出しています。フレーム検出を行うコード部分は次のとおりです。何か間違っていますか?

do 
    {
        uiFrame = getc(pFile);
        if(EOF == uiFrame)
            break;
        cntSize++;
        if(0xFF == uiFrame)
        {
            uiFrame = getc(pFile);
            if(EOF == uiFrame)
                break;
            uiShift=uiFrame>>4;
            if((0xE == uiShift) || (0xF == uiShift))
            {
                if(1 != uiFrameCount)
                    printf("\nFrame Size is %d \n\n",cntSize - PrevoiusFrameSize);

                printf("\nFrame Found at Byte %d", cntSize);
                PrevoiusFrameSize = cntSize;
                CheckFlag         = 1;
                uiFrameCount++;
            }
            cntSize++;
        }
    }while(1 != CheckFlag);
4

3 に答える 3

1

ヘッダーの 3 ニブル (別名 1.5 バイト) であるため、ビット シフトを行う必要があります。疑似コードで:

$data = 'FFEABCDEF....'
         ^^^--3 nibble header
$nibble1 = $data[0];
$nibble2 = $data[1] >> 4; // isolate 3rd nibble
if ($nibble1 == 'FF') && (($nibble2 == 'F') || ($nibble2 == 'E')) { ... }
于 2013-06-22T20:53:46.483 に答える
0

フレームごとに進める必要があります。各フレームは、「デコード」する必要がある 32 ビット ヘッダーで始まります。次のドキュメントを確認してください

完了すると、次の [header+frame] ブロックへのオフセットが得られます。

楽しみ :)

于 2013-11-17T16:05:13.213 に答える
0

次の C マクロを使用して、(4 バイト) フレーム ヘッダーのバイトの順序を簡単に逆にすることができます。

#define swaplong(x)  (unsigned  long)((((x)>>24) & 0xFF) |
((((x) & 0xFF0000) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | ((x) << 24))

次に、同期ビットが (再び) 隣接し、分析がより簡単になります。

于 2014-04-14T14:16:40.150 に答える