从上面的结构图可以看出,PES层是在每一个视频/音频帧上加入了时间戳等信息,PES包内容很多,下面我们说明一下最常用的字段:
pes start code:开始码,固定为0x000001。
stream id:音频取值(0xc0-0xdf),通常为0xc0;视频取值(0xe0-0xef),通常为0xe0。
pes packet length:后面pes数据的长度,0表示长度不限制,只有视频数据长度会超过0xffff。
pes data length:后面数据的长度,取值5或10。
pts:33bit值
dts:33bit值
关于时间戳PTS和DTS的说明:
PTS是显示时间戳、DTS是解码时间戳。
视频数据两种时间戳都需要,音频数据的PTS和DTS相同,所以只需要PTS。
有PTS和DTS两种时间戳是B帧引起的,I帧和P帧的PTS等于DTS。如果一个视频没有B帧,则PTS永远和DTS相同。
从文件中顺序读取视频帧,取出的帧顺序和DTS顺序相同。DTS算法比较简单,初始值 + 增量即可,PTS计算比较复杂,需要在DTS的基础上加偏移量。
音频的PES中只有PTS(同DTS),视频的I、P帧两种时间戳都要有,视频B帧只要PTS(同DTS)。
2. ES 层ES层指的就是音视频数据。
一般的,视频为H.264视频,音频为AAC音频。