簡體   English   中英

MP3幀頭檢測FFF / FFE同步問題

[英]MP3 Frame Header Detection FFF/FFE sync issue

我正在嘗試解析MP3文件並檢測可變比特率(VBR)MP3文件中的所有幀。 我在互聯網上四處張望,找不到合適的解決方案來檢測新的幀頭同步。 在其他文章中,它說我應該尋找FFE或FFF,但是在我的程序中它將無法正確檢測到它。 我不明白我應該如何尋找FFF或FFE? 我將FFE設為0xF,將下一個字節設為0xFE,但是如何獲取FFF卻從中獲取標頭以構建所需的11位1? 我已經看了看這是在所有其他的主題和網站鏈接為旅途中放置的MP3參考,其源代碼,但覆蓋我的問題是一部分,我相信在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的想法和頁面來尋找答案。

謝謝您的幫助。

編輯:在從馬克·BI迅速答復后,大多數人都理解了這個問題,但是在編輯以反映出他的回答后,我現在僅從一個幀中檢測到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);

標頭的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')) { ... }

您需要逐幀進行。 每幀均以您需要“解碼”的32位標題開頭。 檢查以下文件

完成后,您將獲得下一個[header + frame]塊的偏移量。

請享用 :)

您可以使用后續的C宏輕松地反轉(4字節)幀頭中字節的順序:

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

然后,再同步位是相鄰的(再次),並且分析更加簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM