FFMPEG学习

来源:互联网 发布:东北副食店淘宝 编辑:程序博客网 时间:2024/05/16 17:38

decoding time stamp (DTS) and presentation time stamp (PTS)

Some basic video frame terminology. First, there is the intraframe. This is also known as a keyframe. An intraframe is one that can stand on its own. It requires no other frames. It carries with it all the information needed to be decoded.

This definition of intraframe implies that there is a frame type that does depend on another type of frame. What kind of frame depends on other frames? The interframe, which is the opposite of intraframe. An interframe is a frame that has a data dependency on another frame. Usually the interframe depends on the previous frame. In some more complex codecs, an interframe may depend on frames from several frames ago, or the previous intraframe. In some cases, the interframe may depend on frames from the future.

一些基本的视频帧术语,像“intraframe”,它也被称作关键帧.一个关键帧是能够代表自己的(它不依赖于其其它的帧,它自己本身就包含了所有的解码信息)。

关键帧的定义代表着一个不依赖于其它任何类型的帧的帧类型。什么是依赖于其它帧的类型呢?像帧间就是一种完全和内帧定义相反的类型。一个帧间(interframe)的数据依赖于其它的帧。通常一个帧间依赖于前一帧的数据.或者更为复杂的,一个帧间可能依赖于之前的几个帧的数据,或者之前的关键帧。在某些情况下,内帧可能还依赖于未来的某个帧的数据。

一个内帧依赖于其它的帧,这个是什么意思呢?假设#0帧和#1帧恰好完全相同.#0帧将是关键帧,而#1帧则会是随后的帧间.编码#0是必定需要大量的信息的。如果#1帧也作为一个关键帧,它将会像编码#0一样,需要大量的信息。但是一旦编码器能够知道#1帧和#0帧是一样的,编码器能够写入一组编码来表明#1帧的一部分(或者是#1帧的全部)和关键帧(#0)是相同的。这样子节省了信息。或许#1帧和#0帧完全的不同,但是只有轻微的像整个帧的亮度变亮了一点。编码器可以传送变化的信息指示编码器添加从#0到#1像素变化的小值。记住,通常情况下,大量的小数比大量的大数压缩得更好。因此,在这种情况下发送delta的信息比发送wei(Thus, transmitting the delta information in this case tends to be more efficient than transmitting some quasi-random distribution that represents an entire video frame.

下面是关键帧和帧间的不同点:

关键帧相对而言要使用更多的空间;帧间相对而言使用得少些

关键帧相对而言解码快些;帧间相对而言解码慢些

一个应用程序能够随机定位到关键帧;但是不能随机定位到帧间,至少不是在一个干净的视频因为帧间没有携带所有的信息去组成一个完整的帧。

此外,这里可以了解基本的MPEG视频技术的一些术语和概念。

I-frame:这是一个关键帧,最小压缩不依赖于其它帧;

P-frame: 这时一个预测帧,它需要从之前的I帧或者P帧来获取信息(可能或者不可能直接预测它的信息);

B-frame: 这是一个双向预测帧,需要从I帧和P帧获取信息。

MPEG视频包含以下序列的帧信息:

   0 1 2 3 4 5 6 7 8 9   I B B P B B P B B I ...
注意第一次出现的2个B帧(#1 and 2)获取信息完全来自未来的帧#3还有过去的帧#0.它是如何实现的呢?相对于B帧更早的传送P帧。
   0 3 1 2 6 4 5 7 8 9   I P B B P B B B B I ...
因此,解码器首先解码#0(I帧)让它准备好显示。然后解码#3(P帧)保持它的所有权以便进行#1和#2的解码。来自#0和#3的数据被用于解码帧#1和#2.帧#1和#2现在准备好显示并被#3跟随着。帧#6(另一个P-frame) 接下来将被解码因为它和帧#0(最近的I帧)需要被用于解码#4和#5帧。就这么进行。
另一个重要的点就是B帧在MPEG没有数据的依赖性。那意味着没有任何的帧会引用到它们。这样会产生怎样的结果呢?B帧会被略过。让我们考虑下面这一系列的解码帧:
   0 3 1 2 6 4 5 7 8 9   I P B B P B B B B I ...
试想一下,在电脑上进行解码陷入了其他任务,或者仅仅不能够把解码的任务放在第一的地位。电脑解码帧#0,#3,#1,#2还有#6但是这个过程超出了预定的计划。这个解码器有权利去略过一些B帧特别是当认为B帧通常会化肥大部分的解码时间。下面的就是丢失了大量由I帧和P帧提供的视频编码的表现:
   0 1 2 3 4 5 6 7 8 9   I P P P P P P P P I ...
如果到帧#4解码超出了预定的计划,解码器最希望做的事情是丢掉#5-8,在帧#9同步视频。这是假设的视频/容器格式支持关键帧的概念。这是在这种情况下,一般不接受丢帧#5去解码帧#6;假设#6它会使用第5帧的数据当#4是最近解码的。



http://wiki.multimedia.cx/index.php?title=Frame_Types