1.简介
ps流的解析,只要按照标准文档对照16进制的流数据,基本都能看的明白。但是实际项目中会碰到各种各样的问题。本文将对如何高效的解析出音视频数据发表一下个人的看法。
介绍一下本人的开源流媒体,点个star,有兴趣一起开发的朋友也可以联系本人:SimpleMediaServer(流媒体): 旨在开发一个可商用的,功能丰富、高性能、高可扩展的流媒体服务。支持RTSP、RTMP、WEBRTC、GB28181、HTTP-FLV、HLS、JT1078等协议。各个协议可以单独剥离出来,相互独立;也可以互相转换协议。有兴趣一起开发开源项目的朋友可以联系本人(qq 1084855601),包括且不限于音视频后端、信令开发、控制台,前端等。https://gitee.com/inyeme/simple-media-server
2.获取音视频轨道
大部分设备发送的ps流,在ps map头里会有音视频的编码信息,这时,直接读取ps map头里的编码信息,就可以初始化音视频track了,等待获取到视频的sps,pps等信息,音视频track也就完全初始化好了。
但是有一部分的设备,音频的ps map和视频的ps map是两个独立的包,而且两个包之间间隔好几秒,这时候就没法通过某一个ps map包来初始化音视频的track,而是需要集齐两个ps map才行。然而,当一个设备的ps流里只有视频流时,这种情况是没法通过解析视频的ps map去判断,该设备后面会不会发ps map,如果想要确定,那就得等待。然而等待多久,就成了一个问题,如果后续没有音频的ps map,等再久也没用,但是等待的时间短了,可能会丢失掉音频的ps map。
这时候,就需要根据其他的信息来进行判断了。在ps流里,一般情况下,视频包的startcode是E0,音频包的是C0,我们可以根据收到的包情况判断出,该ps流里是否有音频,尽管这时候不知道音频编码格式。如果有音频,那么就等待音频的ps map,如果没有音频包,那收到视频的ps map之后,就可以认为该流已经初始化好了。
除了这种比较坑的设备,还有一种也很恶心,那就是ps map里解析出设备的音频格式是g711a,但实际上设备发过来的确是aac。这种情况,需要在收到音频数据时,再去判断一下该流是不是aac音频流,如果是的,更新一下音频编码格式。视频编码也会碰到这种对不上的情况,但是视频的判断比较麻烦,不如直接去修改设备配置了