如何在 Linux 中从命令行录制音频输出?

如何在 Linux 中从命令行录制音频输出?

我想将音频输出录制到 mp3 文件。我可以在 Ubuntu Linux 终端中使用哪些工具和命令?

答案1

其他答案建议使用以下工具:soxarecordparec。此外,PipeWire用户可以使用pw-cat,尽管其他工具也可以与 PipeWire 配合使用。它们都可以通过以下方式调用:

arecord

arecord --format=cd file.wav

它默认保存.wav。如果您没有指定合适的格式,默认音频质量很差。我喜欢这个程序的一个功能是它的 vumeter 图形输出很好。它还支持动态输出文件命名(通过小时、分钟、天...)。不幸的是,它不能输出为 ogg 或 mp3。


sox

rec file.ext

此程序目前不支持 zsh 补全。它在图形输出中显示一个仪表,但也显示其他信息。它支持 mp3 和 ogg。


pacat

parecord file.ext

它支持 mp3 和 ogg。但它无法在图形输出中显示仪表。


pw-cat

pw-record file.ext

pacat适用于 PipeWire。它支持 ogg 和 mp3 的自定义质量设置,而不pacat支持。它也没有计量图形输出。

要从其他音频设备(例如耳机)录音,您可以使用列出的方法之一这里首先获取录音设备的名称。例如:

pw-cli list-objects | grep node.name

假设这产生了“alsa_input.usb-Logitech_Wireless_Headset.mono”,然后我们使用该名称和选项--target

pw-record --target alsa_input.usb-Logitech_Wireless_Headset.mono file.wav

答案2

首先,您需要提取输出设备的名称:

为此,您可以安装以下数据包:

sudo apt-get install pulseaudio-utils lame mpg123

然后运行:

pacmd list-sinks | grep -e 'name:' -e 'index' -e 'Speakers'

输出可能是这样的:

index: 1
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
        analog-output-speaker: Speakers (priority 10000, latency offset 0 usec, available: unknown)
index: 23
    name: <alsa_output.pci-0000_00_03.0.hdmi-surround71>

找到名称后,您可以运行以下命令将输出录制到 mp3 文件:

parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | lame -r -V0 - out.mp3

或者sox您可以执行以下操作,但我发现第一个解决方案更为强大:

sox -t pulseaudio alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -t mp3 test.mp3 

但是,如果您想自动开始和停止录制,您可以运行:

parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor | sox -t raw -b 16 -e signed -c 2 -r 44100 - test.ogg silence 1 0.1 3% 1 3.0 3%

当声音发送到扬声器时,它会开始录音,如果 3 秒后没有收到任何内容,它会停止录音。有关 的更多信息sox,请参阅其Linux 手册页

答案3

您可以使用arecord为了这。

使用 获取可用设备arecord -l。这将产生如下结果:

card 0: PCH [HDA Intel PCH], device 0: CX20590 Analog [CX20590 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Device [USB Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

然后,要使用 USB 麦克风(卡 1、子设备 0)录音,例如:

arecord --device="hw:1,0" --format=s16_le --rate=48 rec_$(date "+%F_%H-%M-%S").wav

还有 ,-f cd这是 的快捷方式--format=s16_le --rate=44100

设置默认音频源

当你不提供时--devicearecord将从默认音频源。要显示当前默认源,请运行

pactl info | grep "Default Source"

要使用最小文本菜单更改默认源,您可以使用fzf

pactl set-default-source $(pactl list short sources | cut -f2 | fzf)

我发现这比查找卡和子设备索引更舒服。

边录音边听

收听音频设备并同时录制音频通常很有用。我们可以通过使用arecord标准输出写入来实现这-一点,然后将音频数据传输到tee将音频写入文件并将其传递给aplay

arecord -f cd - | tee rec.wav | aplay -

文件转换

将 WAVE 文件转换为您选择的格式:

  • MP3ffmpeg -i rec.wav rec.mp3
  • 奥格ffmpeg -i rec.wav rec.ogg
  • 弹性计算flac rec.wav -o rec.flac

答案4

感谢@Ahmad。这对我有用:

sox -e signed-integer -L -b16 -c2 -r44100 -t raw "|parec -d alsa_output.pci-0000_0c_00.4.iec958-stereo.monitor" -t mp3 -c2 -C 320.01 stream.mp3 silence 1 0.1 3% 1 3.0 3%

其中输入流参数可以通过以下方式查看pacmd list-sinks

name: <alsa_output.pci-0000_0c_00.4.iec958-stereo>
sample spec: s16le 2ch 44100Hz
properties:
        alsa.resolution_bits = "16"

相关内容