Вопрос или проблема
У меня есть несколько неправильно сформированных 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 напрямую:
Все 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 для анализа и обрезки файла или же с помощью специализированных инструментов. Все предложенные методы могут быть автоматизированы и скриптуются, что позволит вам быстро обработать множество файлов. Надеюсь, эта информация окажется для вас полезной, и вы успешно восстановите ваши аудиофайлы.