进入公司的新人培训第二个作业,看了几天的文档都没太搞懂es包的结构,网上的资源也比较少,多数是介绍ts流和pes包的。所以花费了好几天才完成。
这个作业是对第一个作业的继续,在上一次作业中成功提取出来了pes包的视频,这次作业在第一次的基础上将pes包的包头去掉提取出来es视频,然后在es视频中提取出i帧来。
上图是pes包的结构。
pes包6个字节的包头,其中Optional PES Header的长度是不固定的,一个字节的PES Header Data Length的值表示该字段后的字段的长度。后边的pacrt data bytes就是es包了。
所以提取es包就是要确定es包前面的长度。
adaption_control == 0x10时表明ts包中没有调整字段,ts包头后直接是有效负载,若payload_unit_start == 1说明ts包头后面是pes包那么es包前的长度就是length = 4 + 6 + 3 +PES_header_data_length; 若payload_unit_start == 0说明ts包后面的有效负载直接是es包,那么es包前面的长度就是length = 4 ;即ts包header的长度。
adaption_control == 0x30时表明ts包头后面是调整字段,调整字段后面才是有效负载,此时计算e