目录
利用ffmpeg和alsa捕获音频
1.语法:
2.选择输入音频:
3.重启:
4.ALSA混合器的工具:
5.输入操作:
6.举例:
1.记录音频从您的麦克风
2.记录来自应用程序的音频
3.记录来自应用程序的音频,同时将音频路由到输出设备
利用ffmpeg以及ALSA捕获音频非常简单:
ffmpeg -f alsa
input_device告诉ffmpeg你想要使用哪个音频卡或者是设备。你可以输入 arecord -l 或者 arecord -L ,得到所有在你的机器上已经安装的设备列表。
下面是列出来的录音卡或者设备:
$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: ICH5 [Intel ICH5], device 0: Intel ICH [Intel ICH5]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: ICH5 [Intel ICH5], device 1: Intel ICH - MIC ADC [Intel ICH5 - MIC ADC]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: ICH5 [Intel ICH5], device 2: Intel ICH - MIC2 ADC [Intel ICH5 - MIC2 ADC]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: ICH5 [Intel ICH5], device 3: Intel ICH - ADC2 [Intel ICH5 - ADC2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: U0x46d0x809 [USB Device 0x46d:0x809], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
我们可以看到这里有两个音频卡已经安装了音频捕获的功能,名为”card 0”(Intel ICH5)和”card 1”(Microphone on the USB web cam),最简单的方法就是去直接使用-f alsa -i hw:0 or -f alsa -i hw:1引用它们
ffmpeg -f alsa -i hw:1 -t 30 out.wav
我这行命令我们将获得一个30秒的输出WAV格式的音频文件,从我的USB摄像头的默认记录设备(麦克风)记录。可以使用alsamixer工具(参见下面)选择默认的记录设备,或者在hw中使用附加参数Y指定设备:hw:
ffmpeg -f alsa -i hw:0,2 -t 30 out.wav
最好的方法是使用alsamixer工具选择您的卡和默认的记录设备,因为有些音频卡通过ffmpeg命令行选择默认输入的方式非常复杂。
如果你重新启动你的机器,你会注意到有时你的卡被重新排序,所以“卡0”被列为USB音频和“卡1”被列为英特尔音频卡。您可能想要使用udev规则,但是有一个更简单的解决方案。输入arecord -L会给我们一个更详细的记录设备列表:
# arecord -L
null
Discard all samples (playback) or generate zero samples (capture)
default:CARD=ICH5
Intel ICH5, Intel ICH5
Default Audio Device
sysdefault:CARD=ICH5
Intel ICH5, Intel ICH5
Default Audio Device
front:CARD=ICH5,DEV=0
Intel ICH5, Intel ICH5
Front speakers
surround40:CARD=ICH5,DEV=0
Intel ICH5, Intel ICH5
4.0 Surround output to Front and Rear speakers
surround41:CARD=ICH5,DEV=0
Intel ICH5, Intel ICH5
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=ICH5,DEV=0
Intel ICH5, Intel ICH5
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=ICH5,DEV=0
Intel ICH5, Intel ICH5
5.1 Surround output to Front, Center, Rear and Subwoofer speakersdefault:CARD=U0x46d0x809
USB Device 0x46d:0x809, USB Audio
Default Audio Device
sysdefault:CARD=U0x46d0x809
USB Device 0x46d:0x809, USB Audio
Default Audio Device
front:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
Front speakers
surround40:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
4.0 Surround output to Front and Rear speakers
surround41:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=U0x46d0x809,DEV=0
USB Device 0x46d:0x809, USB Audio
IEC958 (S/PDIF) Digital Audio Output
我们可以告诉ffmpeg我们想要使用的确切的卡,指定确切的卡的名称,无论它是什么顺序,如下所示:
ffmpeg -f alsa -i default:CARD=U0x46d0x809 -t 30 out.wav
通过这种方式,您总是需要来自特定设备的输入(来自USB音频设备的默认记录设备),并且永远不会混淆
您可能会发现一个名为alsamixer的工具非常有用
它会让你视觉选择,对于每个指定的卡(英特尔或USB),你想用哪个记录装置(如果指定的卡有多个输入,输出,cd,麦克风,等等),这样你就可以运行alsamixer,按F6选择卡片,然后使用TAB键切换到录音设备(按多次之间切换播放/记录/所有设备),之后,只需使用箭头键来突出显示所需的设备,并只需按空格键来选择它(以及向上/向下、向上/dn键来更改输入音量)。
ALSA输入的唯一有用的音频输入选项是-ar(音频采样率)和-ac(音频通道)。
指定音频采样速率/频率将强制音频卡以指定的速率录制音频。通常默认值是“44100”(Hz)。指定音频通道将强制声卡以单声道、立体声甚至2.1/5.1(如果声卡支持)的形式录制音频。通常,麦克风输入的默认值是“1”(单声道),行入输入的默认值是“2”(立体声)。
在录制视频时,你通常也想录下自己的声音:
ffmpeg -f alsa -ac 1 -ar 44100 -i hw:0 -t 30 out.wav
看看我们的例子设备清单,这将是一样的:
ffmpeg -f alsa -ac 1 -ar 44100 -i default:CARD=ICH5 -t 30 out.wav
加载snd_aloop模块
modprobe snd-aloop pcm_substreams=1
设置默认的ALSA音频输出为.asoundrc(或/etc/asound.conf)中的环回设备的一个子流。
# .asoundrc
pcm.!default { type plug slave.pcm "hw:Loopback,0,0" }
你现在可以记录音频从一个运行的应用程序使用:
ffmpeg -f alsa -ac 2 -ar 44100 -i hw:Loopback,1,0 out.wav
加载snd_aloop模块:
modprobe snd-aloop pcm_substreams=1
像这样设置你的.asoundrc(或/etc/asound.conf):
# .asoundrc
pcm.multi {
type route;
slave.pcm {
type multi;
slaves.a.pcm "output";
slaves.b.pcm "loopin";
slaves.a.channels 2;
slaves.b.channels 2;
bindings.0.slave a;
bindings.0.channel 0;
bindings.1.slave a;
bindings.1.channel 1;
bindings.2.slave b;
bindings.2.channel 0;
bindings.3.slave b;
bindings.3.channel 1;
}
ttable.0.0 1;
ttable.1.1 1;
ttable.0.2 1;
ttable.1.3 1;
}
pcm.!default {
type plug
slave.pcm "multi"
}
pcm.output {
type hw
card
}
pcm.loopin {
type plug
slave.pcm "hw:Loopback,0,0"
}
pcm.loopout {
type plug
slave.pcm "hw:Loopback,1,0"
}
输出pcm指向你想要音频去的输出设备
你现在可以记录音频从一个运行的应用程序使用:
ffmpeg -f alsa -ac 2 -ar 44100 -i loopout out.wav