解决NetStream.appendBytes直播爆音的问题解决
研究了一下Adobe家HDS的具体实现 OSMF。利用其中的一个核心方法 flash.net.NetStream.appendBytes()构建了我们自己的HTTP点直播播放框架。
但今年年初发现一个问题:新框架直播的时候有爆音。
经过一段时间的现象收集,问题总结出来是这样:
1、直播的时候,播放一段时间后出现爆音;
2、同时去听别的电脑,并不是每台电脑上都会出现爆音;
3、出现爆音的不同电脑之间,Mac的爆音现象比Windows明显;
4、出现爆音的同一台电脑上,Mac上Chrome的爆音现象比Safari明显,Windows上Chrome的爆音现象比IE明显;
5、如果不经过浏览器,本地打开swf来播放流,则无爆音。
首先,我们想到了浏览器问题。于是升级最新的浏览器和FP,无效。
然后,开始怀疑Ffmpeg的segment muxer,于是俺自己写了一个Flv segmenter,无效。
接着,尝试看看播放框架本身是不是有什么问题。
我们原有的逻辑是这样:每个flv片都自带flv头以及AVC和AAC的第0帧,每次调用appendBytes()都调用一次appendBytesAction(RESET_BEGIN)。
现在我先用gnu split将一个大的flv文件按照300k一个切开,这样就只有第一个文件片有flv头和AVC的AAC的第0帧了。再构造对应的假直播接口,然后将播放框架的改成只有下载到第一片的时候才调用flash.net.NetStream.appendBytesAction(RESET_BEGIN),而后所有的片都只调用flash.net.NetStream.appendBytes()。
此时我惊喜地发现,爆音现象解除了。
但出现了另一个问题,播放画面开始出现卡顿。于是继续查找卡顿的原因。
卡顿的原因很简单。appendBytes()方法自带了2个buffer。除开正常的IO buffer,还有一个FIFO的tag buffer。它最多存放一个flv tag,每拼装出一个完整的flv tag就将其推入IO buffer。这样它就可以负责保证虽然数据都是一片一片碎片拼装起来的,但IO buffer中都是完整的flv tag。
我之前使用gnu split切分出来的文件肯定不是按照tag的边缘切分的文件。经观察,在片间填充tag buffer的时候就会出现卡顿。
于是使用自己的flv segmenter严格按照tag边缘来切分文件。
卡顿消失!但爆音归来……
最后,我们就想到这爆音会不会跟buffer有点关系呢?
编写框架初期,我们为了让用户减少直播延迟,设置了bufferTimeMax为20,作用是让buffer太满的用户加速播放它们buffer中的流,以追上最新直播点。是不是这个机制导致的爆音呢?
查看OSMF,它是将bufferTimeMax写死为0的。于是我们也将bufferTimeMax设为0。
爆音消失。
反推出几个结论:
1、之前部分电脑无法再现爆音问题,很有可能是因为它们的网速没有快到可以填满buffer的地步;
2、我们可能要使用跳过一些片的方式让网速不稳定用户减少直播的延迟;
3、OSMF里面还是有很多营养值得去吸取的。
这是次历时月余的查错。
现在终于解除了纠结,这感觉真好,真好。
解决NetStream.appendBytes直播爆音的问题解决的更多相关文章
- Monster Audio 使用教程 (七) 防止声音过大,出现爆音
有用户反映,如果音乐音量过大,会出现爆音. 这其实是音频信号过载了.只要最后输出的音量超过0db,就会出现爆音,这是数字音频都应该注意的问题. 所以,为了解决这个问题,限制器就出现了,它能把音频信号压 ...
- # 模乘(解决乘法取模爆long long)
模乘(解决乘法取模爆long long) 二进制思想,变乘法为多次加法,具体思想跟着代码手算一遍就理解了,挺简单的 ll qmul(ll a,ll b,ll m) { ll ans=0; while( ...
- HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师
[导读] 随着音视频内容品类的不断丰富及音乐创作门槛不断降低,大量用户正热切的参与到全民创作的大潮中.我们应该怎么去拥抱移动端影音潜力市场?音频编辑又可以有什么新玩法? 本期直播<音随我动,秒变 ...
- NetStream.appendBytes, 走向Flash P2P VOD的第一步
之前被告知可以自行实现Flash p2p的点播功能, 但一直疑惑, 印象中NetStream并未提供相关方法, 前天看订阅时发现的文章: ByteArray Access to NetStream i ...
- IntelliJ IDEA :解决idea导入项目爆红
转:https://my.oschina.net/LevelCoder/blog/1802158 我们在导入一个新的项目到idea的时候,项目明明没有报错,但是会出现出了父包属于正常颜色外,其子包都会 ...
- Python利用带权重随机数解决抽奖和游戏爆装备问题
关于带权随机数 为了帮助理解,先来看三类随机问题的对比: 1.已有n条记录,从中选取m条记录,选取出来的记录前后顺序不管. 实现思路:按行遍历所有记录,约隔n/m条取一个数据即可 2.在1类情况下,还 ...
- [Windows] 解决kmplayer播放rmvb文件音视不同步
1. 到該帖子 http://www.kmplayer.com/forums/showthread.php?t=8755 下載附件中的4個檔案放到KMP 根 目錄下(此文件已在附件中上传) 2.於KM ...
- AndroidStudio 代码(导入类)报错但可正常运行,以及解决此问题后带来的系列问题解决
首先是应用中很多导入的类都报红色异常显示找不到此类,但运行编译正常: 第一种方法: 点击AndroidStudio菜单File -> Invalidate Caches/Restar… ,在弹出 ...
- 12┃音视频直播系统之 WebRTC 实现1对1直播系统实战
一.搭建 Web 服务器 前面我们已经实现过,但是没有详细说HTTPS服务 首先需要引入了 express 库,它的功能非常强大,用它来实现 Web 服务器非常方便 同时还需要引入 HTTPS 服务, ...
随机推荐
- cc2530操作任务系统初始化分析
操作系统任务初始化void osalInitTasks( void ){ uint8 taskID = 0; // 分配内存,返回指向缓冲区的指针 tasksEvents = (uint16 *)os ...
- php后门屌炸天
fputs(fopen('a.php','w'),'<?php eval($_POST[cc])?>'); php后门有很多,包子也见多了和玩多了,但是在一次帮助朋友检查服务器的时候,竟然 ...
- Cron 时间元素
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素. 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天( ...
- HttpClient 教程 (二)
第二章 连接管理 HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制.而连接操作的很多方面可以使用一些参数来控制. 2.1 连接参数 这些参数可以影响连接操作: 'ht ...
- Java谜题——库谜题
1.Java中的不可变对象和可变对象 (1)不可变类:当你获得这个类的实例的引用之后,你不可以改变这个实例的内容.比如:String,BigInteger,BigDecimal,还有基本数据类型的封装 ...
- 转 mybatis javaType与jdbcType对应
java.sql.Types 值 Java 类型 IBM DB2 Oracle Sybase SQL Informix IBM Content Manager BIGINT java.lang.l ...
- 通过ionice和nice降低shell脚本运行的优先级
对于一些运行时会造成系统满载的脚本, 例如数据库备份, 会影响当时其他服务的响应速度, 可以通过ionice和nice对其IO优先级和CPU优先级进行调整例如降低"/usr/local/bi ...
- C++数据结构之map----第一篇
摘要: 1 对于非标准类型的map,map 只需要重载小于号就可以了 2map结构初始化 map<string,double> g_lr=map<string,double>( ...
- 在阿里云ECS(CentOS6.5)上安装jdk
JDK安装 在安装前先确定服务器上没有安装过JDK 命令: java -version 结果: 查看所有java安装包 命令: yum -y list java* 结果: 选择安装所需要的JDK 命令 ...
- ubuntu apache2 ssl配置
Ubuntu下HTTPS配置非常简单,对大部分用户而言,使用普通的自签名证书,只需按照步骤进行就可以了,无需了解密钥.证书的更多知识,更深的背景 知识还有RSA算法.DES算法.X509规范.CA机构 ...