博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 录音增益调节
阅读量:4165 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
使用nm命令获取linux的可执行文件里或动态库中的所有函数名称
查看>>
关于free命令 内存的详细介绍以及如何手动释放内存
查看>>
Linux使用free命令buff/cache过高
查看>>
如何定义结构体变量及如何使用
查看>>
c语言中 有无bool 这个变量
查看>>
SVN错误:cannot show diff because of inconsistent of newline in the file 的解决方法
查看>>
回调函数的使用总结(非常重要)
查看>>
头文件.H使用注意事项总结
查看>>
无论是static还是非static的局部变量,每个线程都是私有的,其他线程不会对其进行干扰。
查看>>
linux下守护进程启动一个新应用进程的区别system、open和execl (execl在Ubuntu和linux执行的区别)
查看>>
memcpy使用函数注意(如果格式不一样如:memcpy(&A[0],(char *)&B,4))
查看>>
一个结构体的双指针和一个结构体的数组指针使用例子(都可以)
查看>>
多个.C和.H文件的相互调用以及变量的跨文件使用
查看>>
转:Linux 各种BCD时间与Unix时间戳格式转换
查看>>
串口阻塞和非阻塞
查看>>
共用体位域的高低位
查看>>
linux的添加网关 查看网关等信息
查看>>
浅谈C++类中的公有和私有
查看>>
std::string用法总结
查看>>
c++中函数声明的后面加=0
查看>>