Я пытаюсь разобрать MP3-файл и обнаруживать все кадры в формате MP3 с переменной скоростью передачи (VBR). Я посмотрел по всему Интернету и не нашел подходящего решения для обнаружения новой синхронизации заголовка кадра. Из других сообщений говорится, что я должен искать FFE или FFF, но в моей программе он не обнаружит его должным образом. Я не понимаю, как я должен искать FFF или FFE? Я получаю FFE как 0xF и следующий байт как 0xFE, но как получить FFF Я получаю заголовок из этого, чтобы построить необходимые 11 бит из 1? Я просмотрел this, который связан во всех других темах и веб-сайтах, поскольку поместить ссылку на MP3 и его исходный код, но часть, которая охватывает мой вопрос, я предполагаю в файлах CMPA *, которые не указаны в загрузка исходного кода.Обнаружение заголовка фрейма MP3 FFF/FFE проблема
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 кадров, тогда как, если я использую программа сама по ссылке выше написано 8855 кадров на мой тестовый файл mp3. Любая помощь по этому вопросу была бы ВЕЛИКОЙ оценкой, поскольку у меня заканчиваются идеи и страницы Google, чтобы искать ответ.
Благодарим за помощь.
EDIT: После быстрого ответа от Marc B я в основном понял проблему, но после редактирования, чтобы отразить его ответ, я теперь обнаруживаю только 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);
Я уверен, что кадры представляют собой фиксированное количество выборок – tay10r
Я занимаюсь ОПРЕДЕЛЕНИЕМ кадров в файле VBR, где кадры имеют переменную длину, поэтому я не могу использовать формулу для ее вычисления, мне нужно проанализировать весь файл, чтобы найти фактические значения, а не aproximations. – user1795724
Я не сказал фиксированное количество байтов, я сказал образцы. Размер кадра - это фиксированное количество выборок (независимо от скорости передачи). Ссылка [This] (http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm) может помочь ('ctrl + f' * размер кадра *). Вы не можете разобрать/обнаружить каждый байт в файле для последовательности синхронизации, вы неизбежно столкнетесь с звуковыми данными, которые, по совпадению, содержат одну и ту же последовательность. – tay10r