При подготовке потока для воспроизведения DASH точки произвольного доступа должны быть в одно и то же время исходного потока во всех потоках. Обычный способ сделать это - принудительно установить фиксированную частоту кадров и фиксированную длину GOP (то есть ключевой кадр каждые N кадров).
В FFMPEG фиксированная частота кадров проста (-r NUMBER).
Но для фиксированных местоположений ключевых кадров (длина GOP) есть три метода ... какой из них "правильный"? Документация FFMPEG разочаровывает расплывчато по этому вопросу.
Способ 1: возиться с аргументами libx264
-c:v libx264 -x264opts keyint=GOPSIZE:min-keyint=GOPSIZE:scenecut=-1
Похоже, что есть некоторые споры, следует ли отключить сценарное отключение или нет, так как неясно, перезапускается ли "счетчик" ключевого кадра, когда происходит вырезка сцены.
Способ 2: установка фиксированного размера GOP:
-g GOP_LEN_IN_FRAMES
К сожалению, это только задокументировано в документации FFMPEG, и, следовательно, эффект этого аргумента очень неясен.
Способ 3: вставляйте ключевой кадр каждые N секунд (МОЖЕТ БЫТЬ):
-force_key_frames expr:gte(t,n_forced*GOP_LEN_IN_SECONDS)
Это явно документированы. Но до сих пор не ясно, запускается ли "счетчик времени" после каждого ключевого кадра. Например, в ожидаемой 5-секундной GOP, если scenecut
кадр сцены вырезан через 3 секунды с помощью libx264, будет ли следующий ключевой кадр спустя 5 секунд или через 2 секунды?
На самом деле, документация FFMPEG различает эту опцию и опцию -g
, но на самом деле она не говорит о том, как эти две опции как минимум отличаются друг от друга (очевидно, -g
будет требовать фиксированной частоты кадров).
КАКОЙ ПРАВИЛЬНЫЙ?
Казалось бы, -force_key_frames
будет лучше, так как он не будет требовать фиксированной частоты кадров. Однако для этого необходимо, чтобы
- соответствует спецификации GOP в H.264 (если есть)
- он ГАРАНТИРУЕТ, что в фиксированной каденции будет ключевой кадр, независимо от ключевых кадров libx264
scenecut
.
Также может показаться, что -g
не может работать без принудительной установки фиксированной частоты кадров (-r
), поскольку нет гарантии, что многократное выполнение ffmpeg
с разными аргументами кодека обеспечит одинаковую мгновенную частоту кадров в каждом разрешении. Фиксированная частота кадров может снизить производительность сжатия (ВАЖНО в сценарии DASH!).
Наконец, метод keyint
только кажется взломать. Я надеюсь против надежды, что это не правильный ответ.
Рекомендации:
Пример использования метода -force_key_frames