编码用于平滑的前向和后向视频播放


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 并应用增量。

因此,每帧的每帧解码/流媒体成本最多是iframe的成本。但是,落后,它可以更多。例如,如果开启 f6 我想转到前一帧 f5,我需要解码前一个iframe中的所有内容 f1。有没有办法对事物进行编码,以便不会发生这种情况,例如通过另外记录方便(以及某种程度上多余的)信息 f6 - f5

我熟悉ffmpeg,理想情况下想使用它。

我的用例如下:

我正在将视频流式传输到移动客户端。视频始终暂停,用户通过滑块来回搜索。向后搜索有时会冻结,我相信它正在通过一个关键帧,并且必须返回很多并重新编码以达到前一帧。前瞻性很好。

Answers:


2

您似乎希望为每个帧使用关键帧,因此没有正向压缩。如果每个帧完全存储(虽然是压缩的),那么后退和前进的成本将是相同的(除了额外存储空间的成本)。 M-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,而不是预测帧或增量帧。


这应该有效,但可能不需要帧内编码流。看到 这里
Gyan

@Mulvya是的,该选项每个关键帧使用2-3帧,而不是上面提到的1帧。看到+ rtphint开启和关闭的区别会很有趣 - 我猜这在某种程度上取决于OP的用例。
Paul

谢谢。我会试试mjpeg。我将为我的用例编辑OP
Guig
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.