Вопрос или проблема
У меня есть неисправный исходный файл видео HEVC, извлеченный из безымянного видеорегистратора. Если я попытаюсь ремультиплексировать этот файл, например, в mp4, используя ffmpeg -f hevc -i infile -c copy outfile.mp4
, я получаю результат, который воспроизводится несколько секунд, и иногда может декодироваться ключевой кадр. Если же я использую оригинальный файл в FFplay, он может его воспроизвести (хотя перемотка или пауза нарушают воспроизведение).
Можно ли включить устойчивость к ошибкам, которая есть в FFplay, для демультиплексирования FFmpeg?
У этого конкретного файла следующая последовательность единиц NAL:
- VPS_NUT
- SPS_NUT
- PPS_NUT
- PREFIX_SEI_NUT
- IDR_W_RADL
- TRAIL_R (48 раз)
И она повторяется снова. Похоже, что FFmpeg напрямую не может обработать такие “перезапуски”.
PS: Я исключил проприетарные единицы, так как их фильтрация не помогает.
.
Ответ или решение
FFmpeg и FFplay – это два мощных инструмента для работы с мультимедиа, но они имеют разные подходы к обработке ошибок в видео потоках. В вашей ситуации вы сталкиваетесь с проблемой, где FFmpeg не может должным образом обрабатывать "слабые" или "нестабильные" фрагменты в HEVC видеофайле, тогда как FFplay, по-видимому, умеет воспроизводить его с некоторыми оговорками.
Анализ проблемы
Для начала разберём структуру вашего HEVC видеофайла. Исходный файл имеет следующую последовательность единиц NAL (Network Abstraction Layer):
- VPS_NUT (Video Parameter Set)
- SPS_NUT (Sequence Parameter Set)
- PPS_NUT (Picture Parameter Set)
- PREFIX_SEI_NUT (Supplemental Enhancement Information)
- IDR_W_RADL (Instantaneous Decoding Refresh)
- TRAIL_R (необходимы 48 раз)
Такая структура предполагает регулярные "перезапуски", что делает файл уязвимым для синтаксических ошибок при обработке и повторном мультиплексировании FFmpeg.
Различия между FFmpeg и FFplay
FFplay создан с более продвинутыми механизмами устойчивости к ошибкам, что позволяет ему игнорировать некоторые проблемы в потоках и продолжать воспроизведение. Это вполне объясняет, почему вы можете проигрывать файл с FFplay, хотя те же команды FFmpeg приводят к сбою.
Решение проблемы
-
Использование
-noautorotate
и-ignore_unknown
: Эти опции могут помочь FFmpeg обойти проблемные метаданные, хотя и не всегда срабатывает на 100%. -
Библиотека libavcodec:
Рассмотрите возможность использования опций FFmpeg для увеличения устойчивости к ошибкам:ffmpeg -fflags +genpts -i infile -c copy outfile.mp4
-
Программное модифицирование потока:
Если вы разбираетесь в языках программирования, таких как Python, можно вручную удалить или скорректировать проблемные NAL единицы в файле, прежде чем подавать их на обработку FFmpeg. -
Попробуйте другую демультиплексор:
Используйтеhevc-demuxer
для предварительного анализа и "очистки" потока перед подачей его на вход FFmpeg.
Заключение
Различия в механизмах обработки кодека между FFplay и FFmpeg означают, что подходы к обработке ошибок нужно выбирать, исходя из конкретных условий вашего мультимедийного файла. Экспериментирование с различными параметрами и опциями помогает добиться наилучших результатов. Попробуйте разные комбинации перечисленных выше методов, чтобы достичь успеха в проекте. Не бойтесь вносить изменения в процессе работы – именно инновации часто приводят к наиболее эффективным решениям.
Надеюсь, эти рекомендации помогут вам добиться успеха в обработке нестабильных видеофайлов с использованием FFmpeg.