http://marycomputer.blog.163.com/blog/static/1760586412011413825709/
仅仅使用前一个显示的基准帧来编码的帧被称为“P帧”,
同时使用前一个显示帧和未来帧作为基准帧进行编码的帧称为“B帧”。
在通常的场景中,编解码器编码一个I帧,然后向前跳过几个帧,用编码I帧作为基准帧对一个未来P帧进行编码,然后跳回到I帧之后的下一个帧。编码的I帧和P帧之间的帧被编码为B帧。之后,编码器会再次跳过几个帧,使用第一个P帧作为基准帧编码另外一个P帧,然后再次跳回,用B帧填充显示序列中的空隙。这个过程不断继续,每12到15个P帧和B帧内插入一个新的I帧。
节目输入顺序是按实际出现顺序排列的,即I、B、B、P、B、B、P、B、B……I、B、B、P……;但为了解码时便于从I、P画面插补得到B画面,在编码录制节目时,将顺序改变了,即按照I、P、B、B……顺序,即改为按原来0、3、1、2、6、4、5、9、7、8…的画面顺序。解码时先解出0帧、3帧,再由其插补预测计算得出1帧、2帧等等。为此,须在解码器内设置动态存储器,将I、P帧先解码并存储,再计算出各个B帧。不过最后输出时,还是应当按照实际播放顺序重组读出,按正确顺序输出。
I B B P B B P…B B I I P B B P B B … I B B
1 2 3 4 5 6 7 … 1 4 2 3 7 5 6 …
(a) 显示顺序 (PTS 显示时间戳顺序) (b) 编解码顺序(DTS 时间戳的顺序,在封装Nalus时时间戳顺序)
当带有B帧的Nalus流封装后,再次解码显示,此时PTS 和 DTS 不能一一对应,因为B帧的时间戳小于P帧,此时CTS 可以记录这个偏差,用以回复解码的时间戳。
{
CTS :provides the offset between decoding time and composition time. Since decoding time must be less than the composition time, the offsets are expressed as unsigned numbers such that CT(n) = DT(n) +CTTS(n) where CTTS(n) is the (uncompressed) table entry for sample n.
}
这个问题:
http://stackoverflow.com/questions/7054954/the-composition-timects-when-wrapping-h-264-nalus