Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233112
  • 博文数量: 50
  • 博客积分: 1793
  • 博客等级: 上尉
  • 技术积分: 393
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 23:28
文章分类
文章存档

2012年(7)

2011年(17)

2010年(26)

我的朋友

分类:

2010-11-02 15:03:48

新接到的任务是在终端上实现视频通讯,先从语音通讯开始。
1、开发第一阶段硬件平台选择友坚6410平台,原因是由于具备硬件解码、编码能力,视频通讯做起来会比较容易。语音部分oss与alsa选择alsa,比较容易实现双向。但是6410默认不带alsa驱动,需要自己移植,千辛万苦移植成功alsa之后,录音时却发现采集不到声音,有人通过修改arecord源码增加了声卡设备读取功能解决了此问题。但我未解决,便转到用oss方式先开发单向通话。语音通话无非有以下几个方面:声音采集-->声音数据编码-->语音数据传输--->语音数据解码-->播放语音数据,其中语音编码采用的speex,移植比较容易,不多说。代码编写完毕后现象如下:不加编码8k采样率 16位量化位数 单通道  语音延迟比较大  22k以上采样率基本可满足实时需求。出现此现象后开始着手解决,一个阶段一个阶段各个攻破,先从语音采集来解决,打印采集先后的时间,我是每次采集160个sample 共320Kb缓冲区,发现采集10个sample中会有一个超过200ms,导致整体延迟。究其原因是声卡缓冲区过大导致,即读取声音数据时,系统先通过dma方式将声音数据传输到dma buffer,然后再有dmabuffer-->appbuffer ,并且dambuffer必须填充满之后才能读取,这就导致dmabuffer读取完毕后要重新缓冲,大约需要200多个ms,应用程序才能从dmabuffer中继续读取数据,这才产生了上面的延迟现象,解决方法自然是缩小dmabuffer的大小,但不幸的是驱动人员告知dmabuffer修改后可能不稳定。并且6410alsa支持不好,alsa的缓冲也会导致读取声音数据延迟,随即放弃了6410平台

2、第二阶段选择telechip8900平台,telechip技术支持较好,且默认声卡驱动为alsa,移植过程很快,移植结束后测试采集时间,发现非常完美,160个sample仅需20ms,偶尔出现40ms的情况,但已经满足实时通话的要求了,编码解码程序添加也很顺利,之后遇到一个问题是,通话过程中偶尔出现声音卡掉的现象,分析代码发现是server端接收到声音数据写到循环buffer的速度比声卡播放数据的速度快,代码中两个线程一个接收数据,接收到之后pthread_cond_signal通知播放线程进行播放。在接受数据线程pthread_cond_signal之后添加usleep(20)延迟后问题解决。总体情况良好。

3、下一阶段开始研究视频部分。



总结:oss部分参考的如下资料http://www.ibm.com/developerworks/cn/linux/l-ossdev/index.html  采集的数据块尽量是声卡设备每次处理数据的整数倍,缓冲区等设置也最好匹配。
阅读(1377) | 评论(0) | 转发(0) |
0

上一篇:ffmpeg编程参考资料

下一篇:视音频基础

给主人留下些什么吧!~~