1

Есть ли способ кодировать видео, чтобы воспроизведение вперед и назад было очень плавным? Возможно ли это в h264?

Мое понимание базовой структуры кодирования видео состоит в том, что если видео состоит из кадров

f1  f2  f3  f4  f5  f6  f7  f8  f9  f10 ...

которые закодированы как

i1  d2  d3  d4  d5  i6  d7  d8  d9  d10 ...

где

i(k) == f(k), d(k) == f(k) - f(k-1)

т.е. i - iframe, а d - разница кадров, так что размер видео намного меньше размера всех изображений (кадров), потому что дельты меньше целых кадров. Затем, чтобы получить f8 , я должен транслировать и декодировать из ближайшего предыдущего iframe i6 и применять дельты.

Таким образом, стоимость декодирования / потоковой передачи на кадр в последующем не превышает стоимость фрейма. Но, возвращаясь назад, это может быть намного больше. Например, если на f6 я хочу перейти к предыдущему кадру f5 , мне нужно декодировать все из предыдущего фрейма f1 . Есть ли способ кодировать вещи так, чтобы этого не происходило, например, путем дополнительного описания удобной (и каким-то образом избыточной) информации f6 - f5 ?

Я знаком с ffmpeg и в идеале хотел бы использовать его.

Мой вариант использования следующий:

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

1 ответ1

2

Кажется, что вы хотите использовать ключевой кадр для каждого кадра, чтобы не было прямого сжатия. Если каждый кадр хранится целиком (хотя и сжато), то стоимость перемещения назад и вперед будет одинаковой (за исключением стоимости дополнительного места для хранения). M-JPEG делает это естественно, например.

С H264 вы можете установить минимальное и максимальное расстояние между ключевыми кадрами (iframes) при использовании ffmpeg:

--keyint <integer> (x264)
-g <integer> (FFmpeg)
Keyframe interval, also known as GOP length. This 
determines the maximum distance between I-frames. 
Very high GOP lengths will result in slightly more 
efficient compression, but will make seeking in the 
video somewhat more difficult. Recommended default: 250 

--min-keyint <integer> (x264)
-keyint_min <integer> (FFmpeg)
Minimum GOP length, the minimum distance between I-frames. 
Recommended default: 25 

Если вы установите оба из них на 1, то это должно форсировать iframe на кадр, а не прогнозирующие или дельта-кадры.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .