海康PS转H264的编码思想(带图码流解释)

海康PS转H264的编码思想(带图码流解释)

本人PS流解析成H264的其余文章:
01PS流格式
02封装时遇到的重点问题
03海康PS转H264的编码思想(带图码流解释)

1 海康的PS流发包的顺序到底是如何发送的?
根据01PS流格式我们知道他的格式,由PS头,系统头,映射头,PES包(包括包头和视频或者音频数据);但是却不知道他是实际是怎么发包过来的,这也是导致我们编写代码的一个问题,他到底是完整的按一个PS包发过来还是一个个段的先发PS头,再发系统头,再发映射头和最后发PES包,还是先发PS头,再连续发系统头和映射头,然后再发PES包呢?这当时确实也是非常的困扰我,无法下手,于是经过几晚的通宵达旦研究下,终于搞懂他的发包过程。

1)看下面的PS流可以看到,他首先是连续的发送多个海康私有协议的包,这是一个完整的海康私有协议包,我们遇到直接扔掉即可。即利用后面第五第六个字节与PES包一样为包体长度,(00+66)hex换成十进制共102个字节扔掉,这是第一步。实际上第7,8字节也是字段信息,第九个字节即07是可选字段的长度,PES包一般为FF,这个私有包被海康处理过可能是FF可能不是,但这3个字节不用考虑,编码时只需要利用第5,6字节扔掉即可。稍微注意的是后面可能也会遇到该包。
在这里插入图片描述
2)接下来发包的内容就是PS流的PS头了。

3)然后是PS的系统头和映射头,两者一般是合在一起发包的,或者只发系统头,而大部分情况就是只发系统头。

4)最后就是重点了,最后是发送PES包,他可能先发送音频的包(00 00 01 c0 + 音频数据)再发送视频的包,或者调转,但编码操作是一样的。但是最最最重点的是一帧完整的PES包可能需要连续发送。例如此时发送了一个PES包即00 00 01 E0 + 数据,若再发送00 00 01 E0 + 数据,说明是同一帧(同一画面的数据),因为没有遇到新的PS头,不是新的一帧数据。这一点是非常重要的。
看图:
即当我们接收到了第一个PES视频包时,我们作下面两种假设:
1)若下一个同样是以00 00 01 e0开头的话,就是同一帧的画面,必须接收完该画面的数据在av_write写包过去,不然结果就是画面花屏。
2)若下一个包是PS头的话,即00 00 01 a0,说明是新的一帧,可以将第一个PES视频包写过去。
实际上可能有人会问,音频包呢?因为我们不需要音频,所以不处理就相当于将该帧的音频舍弃掉,不会影响我们的判断。
第一个视频包:
在这里插入图片描述

下一个视频包:
在这里插入图片描述
仍然是00 00 01 e0开头,是同一帧数据,必须接收完才能发送。

即总结发包顺序:
海康私有包->PS包头->可能是系统头,映射头或者两者合体->一个或多个视频包,数据格式是00 00 01 e0 + 数据(或者个或多个音频包)。
实际上如果有开发经验的人的话,在编码的时候操作时只需要在PS头和视频包做额外的处理(不考虑音频)。

猜你喜欢

转载自blog.csdn.net/weixin_44517656/article/details/109017742
今日推荐