Как справиться с MP3-файлом с ошибкой “отсутствует заголовок”. Как я могу определить временную метку ошибки?

Вопрос или проблема

У меня есть несколько неправильно сформированных MP3 файлов. В частности, желаемый аудиотрек проходит нормально, но после этого FFplay сообщает:

[mp3float @ 0x7fd7cb82a600] Заголовок отсутствует
[mp3float @ 0x7fd7cb82a600] переполнение, пропускаем -5 завершающих дистанций: -2 -2

И, соответственно, FFmpeg сообщает:

[mp3 @ 0x7fe0c180a400] Аудиопакет размером 749 (начинается с 0F757F48...) недействителен, всё равно записываю его.

После этого во всех проигрывателях, которые я пробовал (FFplay, Audacity, iTunes, VLC), последние несколько секунд трека повторяются. Все, кроме FFplay, также путают продолжительность трека.

Как я могу исправить эти файлы?

Если это нужно сказать: Мне не важно, использует ли результат FFmpeg или нет, или включает ли он несколько проходов с разными инструментами, лишь бы это было скриптируемо. У меня достаточно много таких файлов. Я на macOS 10.14.4. ffmpeg -version:

ffmpeg версия 4.1.3 Авторские права (c) 2000-2019 разработчики FFmpeg
Собрано с использованием Apple LLVM версия 10.0.1 (clang-1001.0.46.3)
Конфигурация: --prefix=/usr/local/Cellar/ffmpeg/4.1.3 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags="-I/Library/Java/JavaVirtualMachines/openjdk-12.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/openjdk-12.jdk/Contents/Home/include/darwin" --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libmp3lame --enable-libopus --enable-librubberband --enable-libsnappy --enable-libtesseract --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-videotoolbox --disable-libjack --disable-indev=jack --enable-libaom --enable-libsoxr
libavutil      56. 22.100 / 56. 22.100
libavcodec     58. 35.100 / 58. 35.100
libavformat    58. 20.100 / 58. 20.100
libavdevice    58.  5.100 / 58.  5.100
libavfilter     7. 40.101 /  7. 40.101
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  3.100 /  5.  3.100
libswresample   3.  3.100 /  3.  3.100
libpostproc    55.  3.100 / 55.  3.100

Также avconv 12.3 не записывает никаких ошибок, но тоже не решает проблему.


Обновление: После дальнейших раздумий я думаю, что самым простым решением, поскольку ошибка всегда в последней части файла, будет точно определить, когда возникает ошибка, и просто обрезать поток. Итак, альтернативный под-вопрос (не совсем уверен в этикете SE для таких вещей): Как я могу определить временную отметку ошибки?

Загрузите поврежденный mp3 файл в mp3DirectCut.exe, а затем просто сохраните файл с новым именем.

Программа автоматически исправит различные ошибки в файле во время его сохранения. Не уверен, исправит ли это вашу конкретную проблему, но стоит попробовать.

mp3DirectCut — это инструмент для редактирования MP3 напрямую:

http://mpesch3.de

Все mp3 кадры переписываются в новый файл и индексируются заново. Таким образом многие ошибки исправляются, без необходимости повторной кодировки файла (он не конвертируется в .wav, но обрабатывается целиком как последовательность .mp3 кадров).

Ответ или решение

Для решения проблемы с MP3-файлами, которые выдает ошибку "отсутствует заголовок", можно использовать несколько хорошо зарекомендовавших себя методов. Давайте рассмотрим, как можно устранить эту проблему, а также как определить момент возникновения ошибки.

Шаг 1: Анализ проблемы

Ошибка "Header missing" от FFplay и "Audio packet of size is invalid" от FFmpeg указывают на повреждения в заголовочной части последних фреймов MP3-файла. Эти повреждения могут быть вызваны неправильным завершением кодирования или передаче файла. Это означает, что, скорее всего, вы столкнулись с проблемой именно в последних секундах трека.

Шаг 2: Определение временной метки ошибки

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

ffmpeg -i yourfile.mp3 -f null -

Это позволит просмотреть всю информацию о фреймах без фактической перекодировки. Обратите внимание на вывод, в частности на потенциальное появление ошибок в конце файла и на общее время воспроизведения.

Вы также можете использовать команду для извлечения информации о фреймах:

ffprobe yourfile.mp3 -show_packets

Эта команда покажет все пакеты, включая информацию о временных метках, что позволит вам определить, где именно происходит ошибка.

Шаг 3: Исправление файла

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

ffmpeg -i yourfile.mp3 -ss 0 -to [положение_временной_метки_перед_ошибкой] -c copy fixedfile.mp3

Подставьте значение временной метки, которое вы определили ранее. Параметр -c copy позволит сохранить аудио в оригинальном качестве, избегая повторного кодирования и, как следствие, возможного ухудшения качества.

Альтернативные инструменты

Если вам необходим более пользовательский и интуитивно понятный подход, вы можете воспользоваться программами, такими как mp3DirectCut. Это приложение позволяет работать напрямую с MP3-файлами без перекодирования и часто справляется с исправлением различных ошибок при сохранении.

Заключение

Ваша проблема с "отсутствием заголовка" в MP3-файле может быть решена с помощью использования FFmpeg для анализа и обрезки файла или же с помощью специализированных инструментов. Все предложенные методы могут быть автоматизированы и скриптуются, что позволит вам быстро обработать множество файлов. Надеюсь, эта информация окажется для вас полезной, и вы успешно восстановите ваши аудиофайлы.

Оцените материал
Добавить комментарий

Капча загружается...