ffmpeg开发的基本知识
这部分请参考我的另一篇博文:https://blog.youkuaiyun.com/FakeTaoZero/article/details/104001059
linux下的录音
linux平台下的录音目前主要使用的比较多的是alsa和pulseaudio两种,网上的录音教程多是使用alsa的,其实pulseaudio也是可以的,这部分的内容最近才开始接触,特意了解了一下,可能不一定对,下面简单说一下两者的关系, 其实这个问题最初要从linux的音频驱动体系说起:
- linux早期的音频驱动是OSS,OSS音频驱动最大的问题是声卡独占问题,即一个应用程序如果要播放/录音,则另一个程序要么无法播放/录音,要么会打断之前程序的功能,因此随着linux的发展,alsa这一新的驱动技术诞生了
- alsa技术理论上是能解决声卡独占问题的,因为它引入了一些逻辑设备的概念,能达到自动混音等功能,但是它太原始了,而且alsa里面的单个设备也是独占的,只不过你可以新建逻辑设备,通过逻辑设备引用物理设备的方式来间接解决问题
而pulseaudio是一种音频服务器,因为声卡的抢占问题而诞生的一种解决方案,其思想是通过pulseaudio来控制声卡,其他应用程序作为client连接到pulseaudio服务器上,引入一层间接性, 从而将音频混音、录音等功能交给pulseaudio来解决,例如linux下的网易云音乐的音频播放功能就是通过pulseaudio来播放的,这一点可以通过播放音乐时杀死pulseaudio来验证,会发现杀死之后就没有声音了。 但是pulseaudio在一些服务器系统上并不是默认安装/启动的,在使用基于pulseaudio开发的应用程序时必须要保证pulseaudio程序已启动。不过linux下的很多桌面环境都是使用的pulseaudio
在ffmpeg中,alsa和pulseaudio都支持,但是需要在编译时将相关的库编译进去,不能可能会在devices里面可能找不到alsa/pulse项,那么怎么确认编译时有没有编译进去呢? 在ffmpeg编译之前需要执行./configure脚本,这个脚本会自动检测依赖库的存在,检测完成之后会打印本次编译时的一个功能组件情况,这时可以到demuxer/device项下面看alsa/pulse项是否存在。
了解过ffmpeg开发基本知识的话就知道,AVInputFormat结构体是输入格式的结构体,可以通过av_find_input_format函数设置,在linux录音中,该项参数设置为"alsa"/“pulse”,而相应的声卡名称则是通过avformat_open_input进行设置。
在这里,声卡的名称获取有几种方式,对于alsa来说,可以使用arecord工具,对于pulseaudio来说,可以使用pacmd工具来查看,下面进行举例说明:
tao@tao-PC:~$ arecord -l
**** CAPTURE 硬體裝置清單 ****
card 0: PCH [HDA Intel PCH], device 0: ALC887-VD Analog [ALC887-VD Analog]
子设备: 1/1
子设备 #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 2: ALC887-VD Alt Analog [ALC887-VD Alt Analog]
子设备: 1/1
子设备 #0: subdevice #0
在这里,列出了两个设备,我们可以看到对应项为:card {数字1}: xxxx, device {数字2}: xxxx,
这里我们重点关注这两个数字,我们选择哪个设备,则alsa下对应的声卡名称为:"hw:{数字1},{数字2}“
tao@tao-PC:~$ pacmd list-sources
2 source(s) available.
* index: 0
name: <alsa_output.pci-0000_00_1b.0.iec958-stereo.monitor>
driver: <module-alsa-card.c>
flags: DECIBEL_VOLUME LATENCY DYNAMIC_LATENCY
state: SUSPENDED
suspend cause: IDLE
priority: 1030
volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB
balance 0.00
base volume: 65536 / 100% / 0.00 dB
volume steps: 65537
muted: no
current latency: 0.00 ms
max rewind: 0 KiB
sample spec: s16le 2ch 48000Hz
channel map: front-left,front-right
立体声
used by: 0
linked by: 0
configured latency: 0.00 ms; range is 0.50 .. 341.33 ms
monitor_of: 0
card: 0 <alsa_card.pci-0000_00_1b.0>
module: 7
properties:
device.description = "Monitor of 内置音频 数字立体声(IEC958)"
device.class = "monitor"
alsa.card = "0"
alsa.card_name = "HDA Intel PCH"
alsa.long_card_name = "HDA Intel PCH at 0xf7d00000 irq 27"
alsa.driver_name = "snd_hda_intel"
device.bus_path = "pci-0000:00:1b.0"
sysfs.path = "/devices/pci0000:00/0000:00:1b.0/sound/card0"
device.bus = "pci"
device.vendor.id = "8086"
device.vendor.name = "Intel Corporation"
device.product.id = "8c20"
device.product.name = "8 Series/C220 Series Chipset High Definition Audio Controller"
device.form_factor = "internal"
device.string = "0"
module-udev-detect.discovered = "1"
device.icon_name = "audio-card-pci"
index: 1
name: <alsa_input.pci-0000_00_1b.0.analog-stereo>
driver: <module-alsa-card.c>
flags: HARDWARE HW_MU