Обнаружение заголовка кадра MP3 Проблема синхронизации FFF / FFE

Я пытаюсь проанализировать файл MP3 и обнаружить все кадры в файле MP3 с переменной битовой скоростью (VBR). Я просмотрел весь Интернет и не смог найти правильного решения для обнаружения новой синхронизации заголовка кадра. Из других постов говорится, что я должен искать 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, чтобы найти ответ.

Спасибо за помощь.

РЕДАКТИРОВАТЬ:
После быстрого ответа от Марка Б я в основном понял проблему, но после редактирования, чтобы отразить его ответ, я сейчас обнаруживаю только 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);

0

Решение

Заголовок на 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')) { ... }
0

Другие решения

Вы должны продолжить кадр за кадром.
Каждый кадр начинается с 32-битного заголовка, который нужно «декодировать».
Проверьте следующее документ

После этого у вас будет смещение к следующему блоку [header + frame].

Наслаждаться 🙂

0

Вы можете легко изменить порядок байтов в (4-байтовом) заголовке кадра с помощью следующего макроса C:

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

Тогда биты синхронизации смежны (снова), и анализ более прост.

0
По вопросам рекламы [email protected]