http live streaming(m3u8 streaming)(mpeg2-ts)
上篇介绍了m3u8文件,本篇介绍MPEG2-TS文件:
MPEG2-TS是一种封装格式,所有的video,audio以及辅助信息(PAT,PMT)都被封装成为188bytes的TS_packet.在TS中用PID来区分不同的stream.其中有一些特殊的PID,如PAT的pid固定是0x0000.
标准是:iso13818-1
优点是每个包都有固定大小,在网络传输中和文件切割时比较方便;
缺点是因为每个包都是188bytes,所以必然会有padding;从而浪费一定的空间,当sample比较小的时候浪费是比较严重的,此时能够通过将多个sample压缩进行打包的方式来实现。
在http live streaming中只需要实现部分标准。
PSI(program specific information)信息:
PAT(program_association_table):是由program_association_section构成。
每个PAS的结构如下图所示:
由上图可以看出PAS用来指定program_map_pid和network PID。对于m3u8 streaming 中network PID 并不需要实现。
PMT(program_map_table):用来指定每个节目中有几路es stream,其中每个stream的PID以及一些相关的描述信息。
PES_packet():用来打包es的格式。其中比较重要的信息有DTS、PTS信息。详细信息请查阅iso13818-1标准。
TS_packet(transport_packet):用来打包PES_packet和PSI信息。
在MPEG2-TS中PID是一个很重要的概念,PID是流的唯一标示符,相同的PID指定的是相同类型的内容。服务器和客户端端是通过PID来实现复用和解复用的。
客户端的解码过程:
1.找到TS_packet的开始位0x47。
3.找到PID为0x0000的PAT,将PAT进行解包,得到每路节目对应的PMT PID(在m3u8 streaming中只有一路节目)。
4.根据PAT解包得到的PMT PID得到PMT,同理将PMT进行解包得到ES pid和对应的类型。
5.根据PMT解包得到的ES PID,将该路流解包得到PES_packet,从而得到ES流和DTS,PTS。此时就能送到decoder去解码了。
服务器端的编码过程:
1.更具PMT PID来生成PAT,并打包成TS_packet来写入文件。
2.根据ES的PID和类型生成PMT,并打包成TS_packet来写入文件。
4.接收video/audio sample,并将一个或者多个sample打包成为PES_packet.
5.将打包好的PES_packet封装成TS_packet写入文件。