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

在视频直播过程中采用了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的接收播放,声音却没有了,应该是在接收端开始播放的时候,声音流还没有构造好,基于这样的猜测,通过调整接收逻辑到缓存存满后触发,完美解决

全文无代码无图,感兴趣需要帮助的同学可留言一起讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值