织梦CMS - 轻松建站从此开始!

罗索

DM6446的音频编解码及播放实现

jackyhwei 发布于 2010-09-21 01:45 点击:次 
DM6446平台应用达芬奇双核技术,能够快速的完成对实时传输要求很高的音频数据处理任务,本设计可以较有效的解决语音抖动和播放延迟的问题,实现音频编解码和播放,为在该平台上开发网络语音通话服务奠定基础,也为在该平台上进行其他多媒体应用提供了参考。
TAG:

摘要: DM6446核心处理器集成了ARM内核与C64x+ DSP内核,提高了系统集成度和整个系统的运算速度,更加适合实时状态下的音频信号编解码处理并实现语音播放。本文主要介绍了音频处理应用程序的构成,着重讲述了音频编解码及播放过程。

关键词:达芬奇技术;DM6446;音频编解码

1基于DaVinci技术的音频编解码综述:
达芬奇(DaVinci)技术是一种专门针对数字音视频应用、基于信号处理的解决方案,能为音视频设备制造商提供集成处理器、软件、工具等支持,以简化设计进程,加速产品创新。

由于大量的音视频编解码工作需要一个强劲的DSP处理器作为支撑,所以在本文提出的解决方案中采用了TMS320C64x+ DSP处理器,它是TMS320C6000系列DSP处理器中性能最为优异的定点DSP核。因为其基于第二代先进超长指令字(Very-Long-Instruction-Word,VLIW)结构,能够很好满足现场音频编解码处理和播放的需求。

2 OSS(开放源代码软件)驱动简介
OSS为多种Unix系统(或Unix兼容的操作系统)提供声卡和其他声音设备的驱动。使用OSS应用程序接口(API)的应用程序在移植到不同的Unix系统(或与Unix兼容的系统)之前只需要重新编译,而不必重写代码。OSS支持的主要设备文件中有些是和声卡拥有的设备如数字声音设备(Digitized Voice Device)、混合设备(mixer)、合成器(synthesizer)等相对应。

2.1 /dev/mixer
混合器设备文件和声卡中的混合器相对应,OSS驱动支持在一个系统中存在多个混合器,不同的混合器被命名为/dev/mixer0、/dev/mixer1等,而设备文件/dev/mixer是某个设备文件的符号链接(通常是第一个混合器,/dev/mixer0)。

2.2 /dev/sndstat
该设备文件不同于其他声音设备,它产生可被读懂的诊断信息。此设备打印出所有被OSS检测到的端口和设备信息。执行命令“cat /dev/sndstat”将会显示设备配置的有用信息。

2.3/dev/dsp和/dev/audio
这些设备是数字音频应用的主要设备。任何写入这个设备文件的数据都会通过声卡中的DAC/PCM DSP设备播放出来。而从此设备文件中读出的数据就是从当前输入设备(默认输入是麦克风)录下的音频数据。

/dev/dsp和/dev/audio设备非常相似。不同在于,/dev/audio在默认情况下使用对数μ律编码,而/dev/dsp使用8位无符号线性编码。μ律编码会把采集的12位或16位数据转换成8位数据。在经过数据转换后,/dev/dsp和/dev/audio对数据的处理是相同的。与设备/dev/mixer相似,OSS同样支持在一个系统中存在多个dsp和audio设备。

3 OSS应用编程设计
下面主要讲解程序中关于OSS驱动控制编程方法。
打开设备文件时使用标志位O_WRONLY来指示该设备以只写的方式打开。除了标志位O_WRONLY外,设备还支持以O_RDONLY(只读)和O_RDWR(可读可写)方式打开。如下图所示为打开音频设备代码:
#define SOUND_DEVICE“/dev/dsp”
soundFd = (SOUND_DEVICE, O_WRONLY);
设定的参数有数据格式、声道格式和采样率。

3.1采样率配置:
采样率是音频播放的重要参数。OSS的API允许设置采样率为1Hz至2GHz中的任何一个频率,但是实际应用中只有有限的几个采样率被用到。下图是配置音频采样率的代码示意:
SNDCTL_DSP_SPEED用于指示ioctl函数对设备文件/dev/dsp的采样率进行配置。

3.2声道格式设置:
程序中将声道格式设置为双声道立体声。OSS中默认模式为单声道,而最多支持16个声道。声道格式配置代码示意如下图所示:
SNDCTL_DSP_CHANNELS指示函数ioctl对设备文件/dev/dsp的声道数进行配置。

3.3采集与播放设置:
采集与播放我们通过read与write函数完成。函数中第一个参数表示设备标识,第二个参数表示缓存地址,第三个地址表示地址长度。如下图所示:
write(soundFd, decodebuffer, BUF_SIZE);
read(soundFd, encodebuffer, BUF_SIZE);

4语音编解码实现
语音模块需要先通过OSS驱动对语音信号进行采集,之后放到共享缓存中交给DSP做语音压缩,收到的数据解压后在通过OSS驱动播放出来。

4.1语音编码
语音编码模块收到了采集进来语音数据后,送到编码缓存中对其进行编码,再在送到传输模块将编码后的数据发送出去,处理流程如下图所示:

①语音模块首先设置两个全局函数--编码缓存和解码缓存,使其可以被传输模块直接使用,作为语音模块与传输模块之间的数据交流通道;
②使用Codec Engine的Engine_open()来创建音频编码算法引擎,返回一个句柄,所有使用相同Engine的模块线程都需要单独的句柄,来确定线程的安全;
③使用speechEncodeAlgCreate()创建编码算法,使用SPHENC_create()里的静态参数来创建“g.711enc”语音编码器;
④使用Memory_contigAlloc()函数为编码缓存与原始音频数据缓存分配一段连续的内存空间;
⑤使用SPHENC_process()函数调用G..711算法对数据进行编码,而后送到传输模块,完成语音编码任务。

4.2语音解码
语音模块收到传输模块传来的编码数据后,先将其解码而后播放出来。解码流程如下图所示

:①语音模块首先设置两个全局函数--编码缓存和解码缓存,使其可以被传输模块直接使用,作为语音模块与传输模块之间的数据交流通道;
②使用Codec Engine的Engine_open()来创建音频编码算法引擎,返回一个句柄,所有使用相同Engine的模块线程都需要单独的句柄,来确定线程的安全;
③使用speechDecodeAlgCreate()创建解码算法,这包括:a.使用SPHDEC_create()里的静态参数来创建“g.711dec”语音解码器;b.使用SPHDEC_control()和XDM_GETSTATUS来设置动态的语音解码参数,查询编解码缓冲区大小;
④使用Memory_contigAlloc()函数为解码缓存分配一段连续的内存空间;
⑤使用SPHDEC_process()函数调用G.711算法对数据进行解码,完成解码任务,而后播放。

小结。DM6446平台应用达芬奇双核技术,能够快速的完成对实时传输要求很高的音频数据处理任务,本设计可以较有效的解决语音抖动和播放延迟的问题,实现音频编解码和播放,为在该平台上开发网络语音通话服务奠定基础,也为在该平台上进行其他多媒体应用提供了参考。

(YDN)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201009/10187.html]
本文出处:61ic 作者:YDN
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容