当你写程序去接收vlc发送的ts流时,你会发现解析出来的一帧视频帧有时候解码会失败,追究其原因,是因为前4个字节不是0,0,0,1。
那为什么会这样呢?
这是因为vlc在处理大于65535字节的视频帧时,没有按照ISO标准来。
ISO标准的做法是将PES_packet_length置为0,如果要获取这帧真实的长度,得借助于payload_unit_start_indicator字段,因为它控制着一帧的开始。
而VLC的做法是把该帧分割成很多个65500再加上不满65500的部分。这些pes包的PES_packet_length分别设为65500和不满65500的长度,并且payload_unit_start_indicator都设为1。这样我们解析的时候,明明只有1帧数据,硬生生解析成了N帧。这样后面的“帧”前四字节自然不是0,0,0,1了,所以解码失败。