本文共 1884 字,大约阅读时间需要 6 分钟。
需求:
项目搭载了带麦的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。此外,因上面代码没有对噪声进行处理,所以噪声同样会被放大。
转载地址:http://hmoxi.baihongyu.com/