解决视频直播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的接收播放,声音却没有了,应该是在接收端开始播放的时候,声音流还没有构造好,基于这样的猜测,通过调整接收逻辑到缓存存满后触发,完美解决。
全文无代码无图,感兴趣需要帮助的同学可留言一起讨论。
问题猜想
接受端没有声音,那无非是这几方面的问题:播放流,播放器,网络。
尝试一:播放器问题,基于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的接收播放,声音却没有了,应该是在接收端开始播放的时候,声音流还没有构造好,基于这样的猜测,通过调整接收逻辑到缓存存满后触发,完美解决。
全文无代码无图,感兴趣需要帮助的同学可留言一起讨论。
相关文章推荐
- UVA 11584 划分回文字串
- chrome 一进入调试页面就会自动打断点
- JAVA开发 - Spring MVC学习
- 记一下关于Instantiate时Awake Start的执行
- linux awk命令详解
- LatinIME中几个主要方法说明
- 【笨办法学Python】习题11:打印出改变了的输入
- Linux挂载硬盘出错:$LogFile indicates unclean shutdown (0, 0)
- web前端知识体系大全【欢迎补充】
- 使用Vi/Vim给文件加密和解密
- 自动化快速实现Parcelable接口序列化
- iOS开发系列--地图与定位
- Android Click事件不响应的情况
- 分布式系统的特点以及设计理念
- jQuery通过CSS()方法给指定的元素同时设置多个样式
- zabbix安装及问题解决
- ACM_归并排序算法
- PAT 《C/C++/Java/Pascal 程序设计基础》习题集 (1) IO
- MyEclipse或Eclipse安装PyDev插件
- HTML5表单详细介绍