Как повторно получить ключевые кадры в поврежденном AVI, используя копию ffmpeg -vcodec

Я обнаружил несколько поврежденных файлов AVI, которые VLC жалуется на неработающий индекс, когда я пытаюсь их воспроизвести. Я могу играть напрямую, без возможности прокручивать временную шкалу или ждать... ждать... пока индекс будет построен (но не сохранен) и играть нормально. Некоторые другие игроки могут играть в них без жалоб, другие отказываются играть.

Я могу легко решить эту проблему в VirtualDub , открыв .avi с «расширенными параметрами» в Open с «повторным получением флагов ключевого кадра» , а затем сохранив новый файл .AVI с прямым потоковым копированием для видео и аудио. Полученный файл воспроизводится отлично.

Я также могу решить проблему с ffmpeg , но не без проблем.

      ffmpeg -i INFILE -vcodec copy -acodec copy OUTFILE

Важно: интересует только потоковая копия и тот же контейнер.

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

ffmpeg работает быстрее, но, самое главное, его можно использовать в сценариях, и можно автоматизировать многие файлы. С VirtualDub приходится вручную обрабатывать каждый файл и ждать ооооооооооооооооооооолное время, пока открытый процесс сначала заново получит флаги ключевых кадров. Не возражал бы, если бы скорость ffmpeg была потеряна из-за автоматизации, которую он может обеспечить.

только очень старое сообщение списка рассылки без ответа.До сих пор я нашел здесь

Может ли ffmpeg исправить такие файлы без вышеупомянутой проблемы? Если да, то как?

Спасибо.

1 ответ

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

VLC, вероятно, анализирует пакеты кодеков, чтобы получить флаг ключевого кадра, если он отсутствует в контейнере, но другие игроки могут этого не делать. Я думаю, что вы ищете, чтобы получить флаги ключевых кадров при потоковом копировании. Точная командная строка немного зависит от кодека. Например, для H264 вы хотите сделать дамп в приложении-B в качестве промежуточного формата файла, а затем перечитать его, чтобы вызвать парсер H264, который устанавливает флаг ключевого кадра, а затем повторно мультиплексировать его в AVI, но H264 в AVI встречается редко, так что, вероятно, это не то, что здесь происходит.

Итак, для решения мне понадобится вывод ffprobe $fileпоэтому я знаю, какой кодек содержит файл AVI.

Другие вопросы по тегам