Android 录音增益调节

需求:
项目搭载了带麦的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。此外,因上面代码没有对噪声进行处理,所以噪声同样会被放大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值