Как извлечь аудиоданные из mp3-файла? - PullRequest
3 голосов
/ 15 февраля 2011

Мне нужно создать независимый от метаданных хеш-файл mp3-файла (то есть тот же хеш-код можно вычислить после повторного тега).Как я могу извлечь аудиоданные только из памяти, без фактического запуска через декомпрессор?

MAD кажется хорошей отправной точкой - http://www.underbit.com/products/mad/, но, очевидно, не предоставляет функции дляделать это.

Любые указатели приветствуются!

Ответы [ 6 ]

6 голосов
/ 16 февраля 2011

Как я могу извлечь аудиоданные только в память, без фактического запуска через декомпрессор?

Вы не можете извлечь аудиоданные, не распаковывая их - они сжаты! Однако, если вам нужен только сжатый поток, читайте дальше!

Типичный аудиофайл mp3 будет разделен на разделы:
[вероятный метатег]
[возможный хлам]
[возможные теги XING / LAME [возможно больше мусора]]
[mp3 аудио кадры]
[возможный метатег]

Вероятный метатег: Большинство аудиофайлов mp3 имеют тег id3 в заголовке. Имейте в виду, что некоторые пользователи могут отмечать свои mp3-файлы различными форматами тегов, такими как APE , поэтому вам придется учитывать это тоже.

Возможный мусор: Некоторые аудиофайлы mp3 были помечены, повторно помечены и преобразованы так много раз, что заголовок метатега может не дать вам точное смещение по первому звуковому фрейму, так как остатки предыдущих тегов могут Быть оставленным позади. foobar2000 имеет возможность исправить это.

Возможные теги XING / LAME: Они содержатся в аудиофрейме mp3, но не содержат реального звука. madplay содержит код, чтобы показать вам, как читать и анализировать эти кадры. Заголовок XING / LAME может иметь количество кадров, поэтому стоит проанализировать эти заголовки. Опять же, если файл прошел через множество различных тэггеров и редакторов, здесь может быть найдено несколько искаженных, недействительных аудиокадров.

Аудиокадры MP3 : Фактический сжатый поток, разбитый на «кадры». Каждый кадр начинается с битовой комбинации синхронизации, 0xFFE.

Возможный метатег : Нередко встречаются дополнительные метатеги в конце файла. id3v1, APE, тексты песен можно найти здесь.

Чтобы найти смещение аудиокадров, вам потребуется проанализировать любые заголовки метатегов, а затем начать поиск битового шаблона синхронизации. Вы не можете просто начать поиск шаблона синхронизации с начала файла, так как не все тегеры правильно поддерживают unsynchronization , поэтому сам метатег может содержать шаблон 0xFFE.

Как только у вас будет смещение к первому звуковому кадру, вы должны посмотреть на конец файла и вычислить, сколько там данных не аудио, чтобы вы знали, когда прекратить анализ аудио. Как только у вас есть смещение к началу аудиоданных и смещение к концу аудиоданных, вы можете передавать аудиоданные с помощью функции хэша / контрольной суммы!

3 голосов
/ 15 февраля 2011

Вы можете использовать ffmpeg для прямого доступа для доступа к аудиоконтенту в режиме copy . Не имеет значения, в каком формате, поскольку API предоставит вам контейнер с необработанными данными (только в режиме копирования). Вы также можете демультиплексировать и декодировать, если у вас есть видео или вы хотите работать с декодированными аудиоданными.

Посмотрите примеры ffmpeg для быстрого ознакомления с тем, как это сделать. Используя ffmpeg, я имею в виду не использование инструмента, а использование libffmpeg (libavformat, libavcodec) изнутри c ++ / c, хотя я думаю, что вы также можете сделать это с помощью cmdline, используя инструмент ffmpeg, отправив свой вывод в stdout и направив его в md5sum или что-то эквивалентное (если вы пользователь Unix, то есть).

Особый случай «-acodec copy» указывает ffmpeg использовать тот же кодек для кодирования, что и для декодирования. Другими словами, транскодирование звука не происходит.

2 голосов
/ 15 февраля 2011

Что за аудиоданные?Необработанный декодированный поток PCM?Отдельные кадры MP3?Что если это MP3, инкапсулированный в .wav?Он все еще может иметь расширение .mp3, но иметь полную обертку .wav вокруг него.

Удаление тега ID3v1 очень просто - это всего 128 байтов в конце файла.ID3v2 немного сложнее - он имеет переменную длину и добавляется к началу MP3, и вам придется анализировать поле длины (4 байта, где используются только самые младшие 7 бит, что дает максимальную длину 28 бит для тега).Оболочка .wav будет еще сложнее - я не знаю каких-либо подробностей о том, что .wav представляет в качестве метаданных.

1 голос
/ 10 июня 2016

Только ffmpeg может вычислять хэш MD5 аудиосегмента аудиофайла, то есть без метаданных.

Использование:

ffmpeg -v -i $file -acodec copy -f md5 -

Обратите внимание, что FLAC уже имеет хэш MD5, сохраненный в качестве метаданных.

1 голос
/ 07 сентября 2015

Мне недавно тоже нужно было решить эту проблему (определить дубликаты mp3-файлов, которые имели разные теги ID3)Проще всего было использовать ffmpeg, чтобы сделать копию mp3-файла со всеми разделенными тегами ID3, а затем взять сумму md5.

См. https://github.com/pepaslabs/mp3md5sum

0 голосов
/ 10 июня 2016

Я написал этот небольшой фрагмент кода для коробки Linux со старым mp3-плеером, который не мог обрабатывать теги. Осталось только заголовки mp3 и данные (на stdout в кодированном виде). Вы можете использовать это для своего md5.

#include <fcntl.h>
#define DUMPTAGS
int main(int argc, char **argv){
   unsigned char buf[4096];
   int len,fd = open(argv[1],O_RDONLY);
   while (len=read(fd,buf,10)){ // handle ID3v2 tags (maybe multiple)
      if (buf[0]=='I' && buf[1]=='D' && buf[2]=='3'){
         len=read(fd,buf,buf[9]|(buf[8] << 7)|(buf[7] << 14)|(buf[6] << 21));
#ifdef DUMPTAGS
         write(2,buf,len);
#endif
      } else break;
   }
   while (write(1,buf,len)){
      unsigned char tag[3] = {'T','A','G'}, *end;
      len=read(fd,buf,4096);
      end=(unsigned char *)memmem(buf,len,&tag,3);
      if (end){ //handle ID3v1 tag (should only be 1)
         write(1,buf,end-buf);
#ifdef DUMPTAGS
         write(2,end,len-(end-buf));
#endif
         break;
      }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...