视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB帧就是最常见的。
- I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
- P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
- B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些,有兴趣可以看看我上面提供的资料),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
同步相关
PTS:Presentation Time Stamp
DTS:Decoding Time Stamp
PCR:Program Clock Reference
STC:System Time Clock
PS是程序数据流(program stream)
ES是基本数据流(elementary stream)
TS是传输数据流(transition stream)
m3u8
m3u8相关tag如下,参考http://tools.ietf.org/id/draft-pantos-http-live-streaming-04.txt :
tag | meaning |
#EXT-X-TARGETDURATION | 定义每个TS的最大的duration。 |
#EXT-X-MEDIA-SEQUENCE | 定义当前m3u8文件中第一个文件的序列号,每个ts文件在m3u8文件中都有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。 |
#EXT-X-KEY | 定义加密方式和key文件的url,用于取得16bytes的key文件解码ts文件。属性:
|
#EXT-X-PROGRAM-DATE-TIME | 第一个文件的绝对时间 |
#EXT-X-ALLOW-CACHE | 是否允许cache |
#EXT-X-ENDLIST | 表明m3u8文件的结束。live m3u8没有该tag。 |
#EXT-X-STREAM-INF | 属性:
|
#EXT-X-DISCONTINUITY |
当遇到该tag的时候说明以下属性发生了变化:
|
#EXT-X-VERSION | #EXT-X-VERSION:<n> ,其中n是个整数,表明协议版本号 |
m3u8客户端的解码过程:
- 找到TS_packet的开始位0×47。
- 找到PID为0×0000的PAT,将PAT进行解包,得到每路节目对应的PMT PID(在m3u8 streaming中只有一路节目)。
- 根据PAT解包得到的PMT PID得到PMT,同理将PMT进行解包得到ES pid和对应的类型。
- 根据PMT解包得到的ES PID,将该路流解包得到PES_packet,从而得到ES流和DTS,PTS。此时就能送到decoder去解码了。