alsa-调节音频音量大小
前言
将使用alsa的录制功能录制出来的音频文件播放后发现,声音音量太小了,所以希望将播放的音量增大。于是,我便在网上搜索了一些相关的资料,整理如下。
在网络上找到的相关问题和博客非常多,但主要只分为两种方式:
- 一种是通过将需要录制/播放的缓存,取出,并乘上一个放大倍数,再写入音频设备或者是录音文件中,从而达到放大音频音量的目的。
- 一种是直接在Linux的终端使用相关的命令来直接设置alsa的录制音量和播放音量。
但实际上,我只成功使用了第二种方法,下面将简单介绍一下第一种方法的原理,和我的尝试,然后将重点放在第二种方法的介绍上。
一。方法一:直接放大缓存中的数据
由于我没有成功通过这个方法来放大音量,所以不详细介绍具体的过程。下面主要是简单介绍一下这个方法的原理和我做过的相关尝试。
1. 基本原理
将采样的数据乘上一个数字或者是除以一个数字,但要注意溢出处理。
具体的过程可阅览参考资料1。
2. 相关尝试和结果
2.1 在播放前放大音频缓存数据
下面是主要的代码(未全)
char *buf;
FILE *fp;
buf = (char*)malloc(size);//size为录音文件大小,int型
memset(buf, 0x00, size);
//打开音频文件
fp = fopen(DEFAULT_PATH, "rb");//DEFAULT_PATH为音频文件路径
fread(buf , 1, size,fp);
//取出缓存区的数据,放大30倍后放回缓存区
int count_value = 0;
int size1 = frames * datablock;//size1为每次写入音频设备的数据大小,
while(1)
{
int tmp;
tmp = (*(buf + count_value)*30);
*(buf + count_value) = tmp;
//将缓存写入音频设备,进行播放
//其中handle为PIC设备句柄,frames为snd_pcm_uframes_t 型变量(此处设为256)。
snd_pcm_writei(handle, buf + count_value, frames);
//移动到缓存中的下一个数据写入位置
count_value = count_value + size1;
//如果读取完整个文件则退出
if( count_value > size)
break;
}
snd_pcm_drop(handle);
snd_pcm_close(handle);
结果是,并没有改变播放出来的音量大小,甚至当我把buf设为0时,音量也没有改变。
2.2 在录制前放大缓存
下面是起放大作用的主要代码:(主要的参数同2.1)
snd_pcm_readi(handle,buffer,frames);//读出录下的数据于缓存
int tmp;
tmp = (*buffer)*40;//放大缓存
(*buffer) = tmp;
fwrite(buffer, 1, size, fd);//将缓存写入音频文件。
结果也是没有将音量变大
。
二。方法二:在linux终端直接设置alsa的参数。
1. 基本原理
直接在终端通过alsa的相关命令,先获取可以设置的参数,然后更改所需参数的值。
2. 过程
2.1 获取可以设置的参数
执行:
amixer controls
可得:
numid=3,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Capture MIC Path'
numid=1,iface=MIXER,name='Playback Path'
numid=4,iface=MIXER,name='Digital Capture Volume'
由名字可知各个参数的含义。
2.2 获取各个参数当前的值
执行:
amixer contents
可得:
numid=3,iface=MIXER,name='Master Playback Volume'
; type=INTEGER,access=rw---RW-,values=2,min=0,max=255,step=0
: values=255,255
| dBscale-min=-20.00dB,step=0.03dB,mute=0
numid=4,iface=MIXER,name='Digital Capture Volume'
; type=INTEGER,access=rw---RW-,values=2,min=0,max=120,step=0
: values=67,67
| dBscale-min=-30.00dB,step=0.41dB,mute=0
由上可知:播放音量参数
的取值范围为【0,255】,录音音量参数
的取值范围为【0,120】.
2.3 设置播放音量参数
和录音音量参数
执行:
amixer cset numid=3,iface=MIXER,name='Master Playback Volume' 255
amixer cset numid=4,iface=MIXER,name='Digital Capture Volume' 120
可得:
录制和播放的音量都设置到最大。