如何在 linux 上使用 ffmpeg 录制音频?

Posted

技术标签:

【中文标题】如何在 linux 上使用 ffmpeg 录制音频?【英文标题】:How to record audio with ffmpeg on linux? 【发布时间】:2013-11-18 15:26:51 【问题描述】:

我想用我的麦克风录制音频。我的操作系统是 ubuntu。我已经尝试了以下并得到了错误

$ ffmpeg -f alsa -ac 2 -i hw:1,0 -itsoffset 00:00:00.5 -f video4linux2 -s 320x240 -r 25 /dev/video0 out.mpg

ffmpeg version 0.8.8-4:0.8.8-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav
developers
  built on Oct 22 2013 12:31:55 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release.
Please use avconv instead.
ALSA lib conf.c:3314:(snd_config_hooks_call) Cannot open shared library
libasound_module_conf_pulse.so
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM hw:1,0
[alsa @ 0xbda7a0] cannot open audio device hw:1,0 (No such file or directory)
hw:1,0: Input/output error

然后我尝试了

$ ffmpeg -f oss -i /dev/dsp audio.mp3

ffmpeg version 0.8.8-4:0.8.8-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav
developers
built on Oct 22 2013 12:31:55 with gcc 4.6.3
*** THIS PROGRAM IS DEPRECATED ***
This program is only provided for compatibility and will be removed in a future release.
Please use avconv instead.
[oss @ 0x1ba57a0] /dev/dsp: No such file or directory
/dev/dsp: Input/output error

我无法让 ffmpeg 找到我的麦克风。如何让 ffmpeg 从我的麦克风录音? 由于this topic,似乎可以忽略“已弃用”消息

【问题讨论】:

您需要在每个命令中包含完整的 ffmpeg 控制台输出。 好的,我添加了所有内容。这有帮助吗? 输出是什么:arecord -l 是的,记录输出工作吗?参考:help.ubuntu.com/community/AudioCapture 这个问题似乎是题外话,因为它是关于 Unix 和 Linux (unix.stackexchange.com) 【参考方案1】:

我意识到这有点老了。以防万一其他人正在寻找:

ffmpeg -f alsa -ac 2 -i default -itsoffset 00:00:00.5 -f video4linux2 -s 320x240 -r 25 -i /dev/video0 out.mpg

这样它将使用默认设备进行录制。您还缺少一个 -i 在视频捕获设备之前 - /dev/device0

如果您想更具体一些,您应该查看 /proc/asound。 检查 cardsdevicespcm 文件和 card 子目录。您应该能够在那里收集到足够的信息,以便能够做出有根据的猜测;例如 hw:1,0hw:2,0

文档可能会提供更多线索:

http://www.alsa-project.org/main/index.php/DeviceNames

网络摄像头也是如此 - 它可能不是 /dev/video0,也许您插入了一个外部网络摄像头,它位于 /dev/video1 - 有查看 /dev 目录并查看可用的内容

【讨论】:

使用脉冲音频时,能够准确选择要录制的音频设备非常有用。 ffmpeg -sources pulse 将列出可用的脉冲源。就我而言,我想要的是系统的默认混合声音输出设备 (alsa_output.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo.monitor)。 ffmpeg 命令则变为:ffmpeg -i pulse -ac 2 -i 'alsa_output.usb-Burr-Brown_from_TI_USB_Audio_CODEC-00.analog-stereo.monitor'【参考方案2】:

解决了!

ffmpeg -f pulse -ac 2 -i default -f x11grab -r 30 -s 1920x1080 -i :0.0 -acodec pcm_s16le -vcodec libx264 -preset ultrafast -threads 0 -y /media/t/TBVolume/desktop/output.mkv 

【讨论】:

提供一个简短的描述来解释这是如何解决问题的。【参考方案3】:

首先,列出您使用的 AV 设备:

ffmpeg -list_devices true -f dshow -i dummy

假设您的音频设备是“麦克风阵列”,您可以使用:

ffmpeg -f dshow -i audio="Microphone Array" -c:a libmp3lame -b:a 128k OUTPUT.mp3

这里,128k 是采样率。您可以检查采样率 (CBR) here 的所有选项。

【讨论】:

问题是关于 Linux 的,但你的答案是关于 Windows 的。 可以将“dshow”替换为“avfoundation”,以便在 Linux 和 Mac OS 上工作。 @KeithBennett avfoundation 仅适用于 macOS/ios。 Linux 可以使用 alsa 和 pulse。

以上是关于如何在 linux 上使用 ffmpeg 录制音频?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 从 RTSP 流录制视频和音频数据

使用 fluent-ffmpeg 与之前录制的音频重叠

JavaCV音视频开发宝典:使用JavaCV采集windows系统声音并录制成mp3音频文件(FFmpeg采集windows系统声音)

JavaCV音视频开发宝典:使用JavaCV采集windows系统声音并录制成mp3音频文件(FFmpeg采集windows系统声音)

JavaCV音视频开发宝典:使用JavaCV采集windows系统声音并录制成mp3音频文件(FFmpeg采集windows系统声音)

在 docker 容器中录制本地音频