ffmpeg跨平台录音技术详解

ffmpeg开发的基本知识

这部分请参考我的另一篇博文:https://blog.csdn.net/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
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值