您的位置:首页 > 其它

解决视频直播P2P过程中接收端无声音问题

2015-07-20 14:52 169 查看
在视频直播过程中采用了P2P的技术,正常的视频流传输没有任何问题,视频正常播放,因为在最初的编码过程中测试都没有测试声音,以为视频流能够正常播放的话,声音肯定也是没问题的,因为TS流对视频流与音频流的处理是在同一个188位的包文件中解决,不可能存在也不会存在声音没有播放的问题,当然这都是你想当然的结果,实际并非如此,且看老衲一步一步给你讲。

问题猜想

接受端没有声音,那无非是这几方面的问题:播放流播放器网络

尝试一:播放器问题,基于HLS协议与OSMF插件实现的播放器存在问题?

解决:在不采用P2P技术播放直播视频的情况下,视频是不存在问题的,那么是否是自己实现的代码造成的,于是根据m3u8寻址解析原理重新构造MediaPlayer的简单P2P接收端,测试结果和之前是一样的,没有声音,于是排除播放器本身问题。

尝试二:播放流问题,接收端用于播放的ts流存在问题?

解决:基于VideoPlayer播放器重写视频接收端,用本地Camera摄像头测试播放流,没有问题。使用发送端解析m3u8地址生成的ts二进制流播放,不能播放,但能够用同样原理构造的mediaplayer播放器播放,到这里,想想就觉得奇怪,不同类型的二进制流当然是不能用同一个播放器播放的啊,我这简直在浪费时间。

尝试三:播放流问题,发送端并没有传送音频流?

解决:这个尝试的解决比较复杂,耗时较长。我们的目的就是找到ts切片解析成二进制文件流的时候音频流是如何生成的。

大致的过程:

前提:osmf框架原理,hls协议原理,m3u8寻址文件常用标签的作用,m3u8列表解析这些属于必掌握基础;

过程:基于HLS原理类图(还有时序图,当时画在纸上的,找不到啦),很容易定位到HTTPStreamingMP2TSFileHandler.as类涉及到视频流与音频流的调用,我们要找的东西就在这。

继续:前前后后调试过程,大概2天时间,跟踪解析TS切片,简单的来说,ts文件中的信息其实就是通过负载类型字段来找,找到后把数据从负载中提取出来,ts中可以有很多媒体类型数据。学习PSI传送流的构成,PAT表,PMT表,CAT表,NIT表等等,包头,负荷,各种总之过程比较痛苦,实在太痛苦……

结果:发现ts文件的视频流和音频流都被一起添加到二进制播放流中,也就是播放流是好的,并不存在未加载的问题。

反思:在得到最终结果之后,认真反思了一下,发现这个过程其实完全不需要,为什么?因为视频流的传输是在发送端下载完成之后,存放在缓存之前,而不是直接读取的发送端缓存,也就是说发送端如果有声音,那么接收端的流也会有声音,它们播放的是同一个。

尝试四:网络问题?

解决:网络问题通过“尝试三”的实践验证过,与网络的好坏无关,网络情况只会影响接收发送流的速度。

尝试五:接收构建逻辑问题!

解决:必然是这样的逻辑错误造成该问题。

从正常的播放到P2P的接收播放,声音却没有了,应该是在接收端开始播放的时候,声音流还没有构造好,基于这样的猜测,通过调整接收逻辑到缓存存满后触发,完美解决

全文无代码无图,感兴趣需要帮助的同学可留言一起讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: