Проблемы с вырезанием видео HEVC с использованием FFmpeg

Мне нужно вырезать видео с помощью FFmpeg, и я не могу перекодировать исходное видео (из-за проблем с производительностью). И столкнулся с проблемой с HEVC видео с айфона: есть глиты в начале обрезанного видео.

Вот как мы конвертировали видео перед выпуском:

ffmpeg.exe -i original.MOV -c:v копировать -c:a aac -ss 4 -y good.mp4

А вот для HEVC видео есть глюки на 1 секунду в начале обрезанного видео:

введите здесь описание изображения

Затем я попытался поставить опцию поиска перед вводом видео:

ffmpeg.exe -ss 4 -i original.MOV -c:v копировать -c:a aac -y good.mp4

Результат вроде хороший:

введите здесь описание изображения

После некоторого гугления выясняется, что вариант -ss перед вводом быстрее, но менее точен, тогда как вариант -ss после ввода и перед выводом медленнее, но точнее.

Итак, мои вопросы:

  • Почему опция -ss ведет себя иначе, чем она ставится до/после ввода?

  • Есть ли способ избежать сбоев, используя опцию поиска вывода ffmpeg?

  • Что значит «более/менее точно»? Означает ли это, что поиск может быть слишком большим или слишком маленьким (больше/меньше, чем мы указали)? Насколько велика может быть эта разница?


person Dmitry Katkevich    schedule 03.11.2017    source источник


Ответы (1)


Почему опция -ss ведет себя иначе, чем она ставится до/после ввода?

При использовании в качестве параметра ввода (-ss … -i …) ffmpeg сначала ищет указанную позицию во входном потоке, а затем начинает декодировать кадры.

При использовании после ввода (-i) ffmpeg будет декодировать поток с самого начала и отбрасывать все кадры, предшествующие заданной метке времени.

Обратите внимание, что обычно метки времени сбрасываются при использовании -ss до -i, что означает, что:

  • -ss 10 -i … -t 10 создает 10-секундный клип, начиная с 00:00:10,
  • -i … -ss 10 -to 20 делает то же самое,
  • -ss 10 -i … -to 10 делает то же самое.

Есть ли способ избежать сбоев, используя опцию поиска вывода ffmpeg?

Да. Глюков при транскодировании быть не должно вообще, так как сначала будет декодироваться поток, включая все необходимые предыдущие кадры, даже если они не входят в диапазон поиска. Затем начнется перекодирование, и выходным кадрам будут назначены новые временные метки.

Что значит «более/менее точно»? Означает ли это, что поиск может быть слишком большим или слишком маленьким (больше/меньше, чем мы указали)? Насколько велика может быть эта разница?

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

Вопрос точности относится только к потоковому копированию (-c copy). Здесь вы можете начать создавать действительный вывод только с ключевой кадр; все предыдущие кадры бесполезны.

Следовательно, если у вас есть ключевые кадры, например, на секундах 2, 4, 6, …, но вы укажете обрезку на секундах 5, ffmpeg сможет производить вывод только с секунд 6. Однако он будет включать кадры с секунд 5–5. 6, хотя и с отрицательной отметкой времени, чтобы декодер их не отображал.

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

В таких случаях лучше всего перекодировать видео.

person slhck    schedule 04.11.2017