1、一个mpg文件可以只包含视频内容,那么文件开头以0x000001B3作为起始码
2、以0x000001BA 开头,就意味着同时包含音频数据和视频数据,如果没有音频数据,则以0x000001B3开头
3、一个mpg文件可以包含多个pack,每个pack的起始码都是0x000001BA ,pack没有结束码,一般遇到下一个0x000001BA 开头,就意味着此pack结束。
4、Pack头一般应该是14字节,4字节的开始码或者叫起始标志位,以0x000001BA或者0x000001B3作为起始码.然后紧跟着10字节的pack header,即pack头信息,这个头信息一般没有太多有用的内容,不解析。(Pack的具体组成件附件1,pack具体格式)
5、Pack由3部分组成pack_header、system_header(具体长度为head_length+4(起始码4B)+2(head_length 2B))、PES_packets(多个)。其中system_header当且仅当pack是第一个数据包是才存在。
6、PES_packets的结构:
a) 4字节的起始码,一般是3字节包头起始码前缀的0x000001+1字节的数据流识别stream_id。
b) 2字节的pes包长
c) 紧接着是不定长的基本流特有信息,其中包含:1)2字节的pes包头识别标志,或者叫控制标志位,主要内容是pes加扰控制、优先级、版权以及PTS\DTS标志等(有否PTS/DTS标志,是解决视音频同步显示、防止解码器输入缓存器上溢或下溢的关键所在)。2)1字节的PES扩展数据长度,即pes包头长。3)0-46B的信息区。4)最多256字节的填充字节。
d) 最大长度为65526(2^16-1-6-3)字节的包数据。
7、根据PES_packets结构中的前4字节的起始码,可以判断当前pes包里面的数据的具体内容是什么。比如:
a) 0x000001E0 - 0x000001EF: Video PES start code();
b) 0x000001C0 - 0x000001DF: Audio PES start code(ISO/IEC 13818-3 or 11172-3);
c) 0x000001BD: Private Stream(AC3)
8、关于video_pid、音、视频编码方式和文件类型:
a)如果起始码是0x000001B3,那么那么后面的pes数据是视频且为原始流,video_pid=0x01;video_codec=0x02;file_type=ES( Elementary Streams (原始流),对视频、音频信号及其他数据进行编码压缩后的数据流称为原始流).参看mpeg2标准13818-2视频部分文档。
b)如果起始码是0x000001E0-0x000001EF,即(stream_id>=0xe0)&&(stream_id<=0xef),那么后面的pes数据是视频,video_pid=stream_id;video_codec=0x02;file_type=mpg。
c)如果起始码是0x000001C0-0x000001DF,即((stream_id>=0xc0)&&(stream_id<=0xdf)),那么后面的pes数据为音频数据,audio_pid =stream_id;audio_codec= 0x04ÿ