Ошибка устойчивости FFmpeg (как FFplay)

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

У меня есть неисправный исходный файл видео 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 приводят к сбою.

Решение проблемы

  1. Использование -noautorotate и -ignore_unknown: Эти опции могут помочь FFmpeg обойти проблемные метаданные, хотя и не всегда срабатывает на 100%.

  2. Библиотека libavcodec:
    Рассмотрите возможность использования опций FFmpeg для увеличения устойчивости к ошибкам:

    ffmpeg -fflags +genpts -i infile -c copy outfile.mp4
  3. Программное модифицирование потока:
    Если вы разбираетесь в языках программирования, таких как Python, можно вручную удалить или скорректировать проблемные NAL единицы в файле, прежде чем подавать их на обработку FFmpeg.

  4. Попробуйте другую демультиплексор:
    Используйте hevc-demuxer для предварительного анализа и "очистки" потока перед подачей его на вход FFmpeg.

Заключение

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

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

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

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