Android 录音失真具体解决方案
我们曾经在一篇文章中为大家详细介绍过有关
Android 多媒体录制功能的一些实现方
法。其中就包括对录音的实现方法。今天我们可以通过这篇文章介绍的内容详细了解
Android
录音失真的具体解决方法,以帮助大家解决实际应用中出现的问题。
在
6410+WM9714 的 Android 平台上测试 MIC IN 录音功能,出现一个 BUG。在该平台
声音播放是完全正常的,但是录音后再播放刚录的声音,会有失真,同样的录音文件在电
脑上播放也一样,说明是
Android 录音失真的问题。后来通过打印 9714 的寄存器,发现录
音频率是
8000HZ,放音频率是 44100HZ,这时基本上可以确定是由这个不匹配引起的。
我在
Android 代码里:AudioHardwareALSA.cpp 文件中的函数中设定采样率,如下:
1
AudioStreamInALSA::AudioStreamInALSA
(AudioHardwareALSA *parent) :mParent(parent) {
2
static StreamDefaults _defaults = { ....................
3
sampleRate : AudioRecord::DEFAULT_SAMPLE_RATE, ....................
4
}; }
设定了:
5
static const int DEFAULT_SAMPLE_RATE = 44100;
但是重烧程序后结果仍然存在
Android 录音失真这一问题,采样率还是 8000,似乎被
其他地方把值覆盖了。后来我试着把所有的采样率
8000 的地方全都改成 44100,结果仍然
一样是
8000。到底是不是采样率的原因引起的呢?
之后用
arecord 命令来录音,前提是不能进入 Android,否则音频设备会被占用。结果录
得的声音播放时仍然是同样的效果,当时估计这问题应该跟
Android 上层没有什么大的关
系。后来别人有试通过将播放速度加快一倍,就得到的正常的播放音,但问题是仍然不知从
何处来解决这个问题。
后来经过台湾同事的挖掘,改动录音
MIC IN 的 DMA SIZE 解决了此次问题。改动列出
如下,原因尚待分析。
6
static struct s3c24xx_pcm_dma_params
s3c6400_ac97_mic_mono_in = { .client = &s3c6400_dma_client_micin,
7
.channel = DMACH_AC97_MIC_IN,
.dma_addr = S3C6400_PA_AC97 +
S3C_AC97_MIC_DATA,
8
.dma_size = 2,///4 };
该参数最终在
s3c24xx_pcm_hw_params 中修改 DMA 配置所用。Android 录音失真的相