实时在线音频延时的处理(借用speex)
2016-01-19 21:01
323 查看
实际项目中出现实时在线音频播放会有累加延时的问题,越久延时越长。
经过各方面检查发现是设备发送音频数据频率不稳定产生的:
比如本来应该是每秒5包音频包的数据过来的,但是某一秒设备没把数据及时发过来,造成这一秒内没数据播放,但是下秒又多了数据,但是播放速度是固定的,所以相当于延时了一秒,这种情况出现多了延时就会变长。
后来分析了下网络出现这种情况比较常见,特别这个项目是用3G网络可能性还是蛮大的。
解决方法是利用speex判断静音及噪音帧,在延时的情况下丢弃静音及噪音帧,不播放赶上本来的进度
m_pSt = speex_preprocess_state_init(L_FRAME, 8000);
iParam = 1;
speex_preprocess_ctl(m_pSt, SPEEX_PREPROCESS_SET_VAD, &iParam); //静音检测
L_FRAME是帧的长度,单位为short,所以是L_FRAME*2字节
8000采样率
<span style="white-space:pre"> </span>vad = speex_preprocess_run(m_pSt, pcmFrame);
if (0 == vad)
{
//静音或噪声
dif = m_decodingBuf.endPos - startPos;
if (480 < dif || (0 > dif && 480 < m_decodingBuf.maxLen + dif) )
{
continue;
}
else if (5 > m_block.freeblock)
{
continue;
}
}碰到静音或噪声帧时判断下缓存数据长度是否比较长,及已经播放完可用的帧是否很少(即等待播放的帧比较多,这里总共有30快,小于5表示还有25快在等待播放)。
用完记得释放speex
<span style="white-space:pre"> </span>if (NULL != m_pSt)
{
speex_preprocess_state_destroy(m_pSt);
m_pSt = NULL;
}
经过各方面检查发现是设备发送音频数据频率不稳定产生的:
比如本来应该是每秒5包音频包的数据过来的,但是某一秒设备没把数据及时发过来,造成这一秒内没数据播放,但是下秒又多了数据,但是播放速度是固定的,所以相当于延时了一秒,这种情况出现多了延时就会变长。
后来分析了下网络出现这种情况比较常见,特别这个项目是用3G网络可能性还是蛮大的。
解决方法是利用speex判断静音及噪音帧,在延时的情况下丢弃静音及噪音帧,不播放赶上本来的进度
m_pSt = speex_preprocess_state_init(L_FRAME, 8000);
iParam = 1;
speex_preprocess_ctl(m_pSt, SPEEX_PREPROCESS_SET_VAD, &iParam); //静音检测
L_FRAME是帧的长度,单位为short,所以是L_FRAME*2字节
8000采样率
<span style="white-space:pre"> </span>vad = speex_preprocess_run(m_pSt, pcmFrame);
if (0 == vad)
{
//静音或噪声
dif = m_decodingBuf.endPos - startPos;
if (480 < dif || (0 > dif && 480 < m_decodingBuf.maxLen + dif) )
{
continue;
}
else if (5 > m_block.freeblock)
{
continue;
}
}碰到静音或噪声帧时判断下缓存数据长度是否比较长,及已经播放完可用的帧是否很少(即等待播放的帧比较多,这里总共有30快,小于5表示还有25快在等待播放)。
用完记得释放speex
<span style="white-space:pre"> </span>if (NULL != m_pSt)
{
speex_preprocess_state_destroy(m_pSt);
m_pSt = NULL;
}
相关文章推荐
- 趟过Appium的坑(1 Chrome version must be >= 43.0.2357.0)
- SpringMvc (三) hibernateValidator jsr 303 验证规则
- Dalvik的JIT编译流程 & ART的dex2oat流程
- jQuery中的Ajax总结
- 关于移动端UI适配的整理
- OpenGL教程(25) skybox
- 速卖通承认的承运商代码
- web.xml配置
- 赋值不是初始化
- github删除 4000 仓库详细步骤
- “微信故事”盗号?为何谣言总能在微信快速发酵?
- 通知
- 需要看的书籍
- matlab unique函数
- java学习心得 关于如何设计一个拼图游戏
- 文字动画(Textdh)
- android获取view宽高的几种方法 - ysl_longer
- ActiveAndroid 简单方便的ORM(对象关系映射)
- 当你输入一个网址,实际会发生什么?
- 不要为做而做