有没有办法对视频进行编码,使正向和反向播放非常流畅?在 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
并应用增量。
因此,以后每帧的解码/流式传输成本最多相当于 iframe 的成本。但往后看,成本可能会更高。例如,如果f6
我想转到上一帧f5
,我需要解码前一 iframe 中的所有内容f1
。有没有办法对事物进行编码以避免这种情况发生,例如通过额外存储方便(且在某种程度上是多余的)的信息f6 - f5
?
我熟悉 ffmpeg 并且希望使用它。
我的用例如下:
我正在向移动客户端流式传输视频。视频总是暂停,用户通过滑块来回搜索。向后搜索有时会冻结,我认为这是因为它在经过关键帧时必须返回很多并重新解码才能到达上一帧。向前搜索没问题。
答案1
似乎您想对每一帧使用一个关键帧,这样就不会进行前向压缩。如果每一帧都完整存储(尽管经过压缩),那么后向和前向的成本将是相同的(除了额外存储空间的成本)。 JPEG格式例如自然地做到这一点。
使用 H264 时,您可以在使用 ffmpeg 时设置关键帧(iframe)之间的最小和最大距离:
--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,并且没有预测帧或增量帧。