菜鸟修炼笔记-alsa-调节音频音量大小

alsa-调节音频音量大小

前言

将使用alsa的录制功能录制出来的音频文件播放后发现,声音音量太小了,所以希望将播放的音量增大。于是,我便在网上搜索了一些相关的资料,整理如下。

在网络上找到的相关问题和博客非常多,但主要只分为两种方式:

  1. 一种是通过将需要录制/播放的缓存,取出,并乘上一个放大倍数,再写入音频设备或者是录音文件中,从而达到放大音频音量的目的。
  2. 一种是直接在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

可得:
录制和播放的音量都设置到最大。

参考资料:

  1. PCM音频数据音量大小调节
  2. linux alsa 音量参数
上一篇:java内存溢出分析工具:jmap使用实战


下一篇:HADOOP实战