概述
需求:
项目搭载了带麦的USB摄像头,用于视频通话功能,人对着摄像头说话的距离评估在5米,而不像手机可以拿在手上近距离的对着MIC说话,所以,在测试中觉得摄像头采集的声音很小,需要增大录音音量。首先想到的是设置CPU内部Codec中录音增益,不过现在已经最大了,只能通过软件解决。
下面是在android/hardware/aw/audio/homlet/audio_hw.c添加了录音增益调节的代码:
static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
size_t bytes)
{
。。。。。。
if(use_volume_gain){ //use_volume_gain由属性sys.use.volume_gain控制
size_t i = 0;
unsigned int value = 0;
int32_t data32 = 0;
unsigned char * buffer_temp=(unsigned char *)buffer;
//ALOGV("channel_count:%d curFrameSize=%d",channel_count,curFrameSize);
for( i=0; i< bytes; i=i+2){
short data16; //只针对AUDIO_FORMAT_PCM_16_BIT
unsigned int value_temp = 0;
value = buffer_temp[i+1]; //第二个字节为高位数据
value = (value<<8)+buffer_temp[i]; //获得一个16bit的音频数据
value_temp = value; //备份
if(value & 0x8000){//音频数据是负数
data16 = value&0xFFFF;
data32 = ~data16 + 1; //转正数,保存到32bit以防止后面计算溢出
data32 = data32*volume_gain_value; //增益调节,volume_gain_value由属性sys.audio.in.volume_gain控制
if(data32 > 0x7FFF)
data32 = 0x7FFF; //音量最大值
data16=(short)(data32 &0xFFFF);
value= ~data16 + 1; //转负数
}else{ //正数
value = (unsigned int)(value*volume_gain_value); //增益调节
if( value > 0x7FFF)
value = 0x7FFF; //音量最大值
}
buffer_temp[i] = (unsigned char)(value&0xff); //获得低8位的音频数据
buffer_temp[i+1] = (unsigned char)((value>>8)&0xff); //获得搞8位的音频数据
}
}
/* audio dump data write */
debug_dump_data(buffer, bytes, &in->dd_read_in);
}
注意,这里只是简单的对音频数据进行修改,增益倍数volume_gain_value不是自适应的,由实验测试评估得来,软件也可以对上面“溢出”的数据量进行统计,然后适当的改变volume_gain_value。此外,因上面代码没有对噪声进行处理,所以噪声同样会被放大。
最后
以上就是自由小刺猬为你收集整理的Android 录音增益调节的全部内容,希望文章能够帮你解决Android 录音增益调节所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复