Использование cat для объединения файлов mp3. Что это за черное колдовство?

#mp3

#mp3

Вопрос:

Мой друг только что использовал plain-old cat для объединения двух файлов mp3,…

 cat file1.mp3 file2.mp3 > out.mp3
  

…и результирующий файл отлично воспроизводится, воспроизводится одна песня, а затем следующая.

Что это за черная магия? Что случилось с заголовками, метаданными? Как это может работать? Длительность даже отображается корректно.

Ответ №1:

Файл MP3 — это не что иное, как необработанные потоковые данные MPEG2-Layer 3 (аудио), в нем нет структуры заголовка на уровне файла, например, с указанием длительности, исходного источника, информации о кодировке. Поток MP3 состоит из блоков, начинающихся с маркера синхронизации FF Fx, поэтому произвольные данные, такие как теги ID3, могут быть размещены где угодно и не повлияют на звук. Игроки либо угадывают длительность по битрейту и размеру файла, если в тегах ID3 нет этой информации, либо выполняют полное сканирование файла, чтобы точно рассчитать ее.

Комментарии:

1. Да — файлы MP3 странны тем, что они представляют собой просто необработанный поток без какой-либо инкапсуляции. Одна поправка: обычно они имеют формат MPEG1-Layer3.

2. @John: О? Я всегда слышал MPEG2, это потому, что это «текущий» mp3? Или я просто сумасшедший?

3. Номера MPEG на самом деле не являются версиями — это просто стандарты, которые увеличиваются. В этом случае MPEG-2 расширяет аудиостандарт MPEG-1 с некоторыми более низкими битрейтами и, как ни странно, не полностью перекрывается с ним — он не допускает высоких битрейтов. Итак, то, что большинство людей использует на 128 кбит, на самом деле является MPEG-1 Layer-3. Смотрите ссылку «заголовки mp3» в другом ответе.

Ответ №2:

Не забывайте, что проигрыватели обычно готовы обрабатывать кодировки с переменным битрейтом, поэтому каждый кадр в любом случае может иметь разный битрейт.

Что касается метаданных, то это странная ошибка; даже при том, что теги id3 из обоих треков будут включены в новый файл, большинство проигрывателей будут искать теги только в конце файла для отображения пользователю и просто пропускать встроенные теги в середине файла как известный «не музыкальный» контент. Некоторые могут воспроизводить мусор или вылетать, но я сомневаюсь, что они были бы популярны, если бы были такими хрупкими.

И обратите внимание, что заголовки mp3 не кодируют никакой информации об общем размере файла — все это вычисляется во время выполнения. (Возможно, с помощью магии.)

Раньше, когда я пытался выучить немецкий язык, слушая потоковые радиостанции, я часто использовал dd разделение гигантских потоков, угадывая, как далеко в треке я хотел бы начать и остановить нарезки… неэлегантно, но перекодировки не было, и мой плеер отлично с этим справился.