2013-06-22 2 views
0

Я пытаюсь разобрать 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); 
+0

Я уверен, что кадры представляют собой фиксированное количество выборок – tay10r

+0

Я занимаюсь ОПРЕДЕЛЕНИЕМ кадров в файле VBR, где кадры имеют переменную длину, поэтому я не могу использовать формулу для ее вычисления, мне нужно проанализировать весь файл, чтобы найти фактические значения, а не aproximations. – user1795724

+0

Я не сказал фиксированное количество байтов, я сказал образцы. Размер кадра - это фиксированное количество выборок (независимо от скорости передачи). Ссылка [This] (http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm) может помочь ('ctrl + f' * размер кадра *). Вы не можете разобрать/обнаружить каждый байт в файле для последовательности синхронизации, вы неизбежно столкнетесь с звуковыми данными, которые, по совпадению, содержат одну и ту же последовательность. – tay10r

ответ

0

3 полубайта (aka 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

Спасибо, Марк, я попробую сразу. Спасибо за быстрый ответ, я вернусь с результатами, надеюсь. – user1795724

+0

Еще один вопрос, почему FFF - последовательность синхронизации? Это будет 12 бит, а не 11, как я вижу в спецификации ... пожалуйста, объясните? – user1795724

+0

Прошло много времени с тех пор, как я ворвался в mp3-спецификации, но, похоже, я помню, что они выбрали FFE как значение, которое обычно не отображается в кадре. FFF требует 12 байтов для представления (11111111 + 1111), но FFE составляет всего 11 (11111111 + 1110) –

0

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

После выполнения вы получите смещение к следующему блоку [заголовок + кадр].

Наслаждайтесь :)

0

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

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

Тогда syncrhonization биты являются смежными (снова) и анализ более прост.

+0

Я поместил код в блок кода для вас, так что начальный «#» вернулся; не стесняйтесь редактировать его дальше, чтобы добавить некоторые отступы, если это необходимо. – andrewsi