使用 PulseAudio 录制节目的输出

use*_*950 64 scripts pulseaudio audio-recording

我想使用命令行/bash 脚本用PulseAudio记录程序的输出。重要的是不要记录所有输出,而只记录一个特定程序的输出。

我想我必须创建一个新的空接收器,然后将程序的输出移动到这个新接收器。比告诉parec使用这个特定的监视器来记录。

第一步将是这样的:

pactl load-module module-null-sink sink_name=steam
Run Code Online (Sandbox Code Playgroud)

但是现在如何将程序的输出移动到这个接收器?
以及如何使用 bash 脚本记录特定的接收器?

小智 67

尝试这样的事情:

在终端输入

pacmd
Run Code Online (Sandbox Code Playgroud)

(这是 PulseAudio-Server 的 CLI)然后使用

list-sink-inputs
Run Code Online (Sandbox Code Playgroud)

(在那里您可以获得正在运行的输入的索引)现在找到您的输入的索引。现在称为 $INDEX

可编写脚本的部分是:

pactl load-module module-null-sink sink_name=steam
pactl move-sink-input $INDEX steam
parec -d steam.monitor | oggenc -b 192 -o steam.ogg --raw -
Run Code Online (Sandbox Code Playgroud)

说明:

  • 如您所知,第一个命令将添加一个空接收器。
  • 第二个命令将接收器输入从标准音频接收器移动到蒸汽
  • 第三个命令记录设备 Steam 的监视器 (-d) 并将输出 (raw-wave-stream) 放入 oggenc 中,oggenc 将此波形流编码为 oga 文件。(对于 mp3 使用跛脚)

  • 你能解释一下如何撤消这个操作吗?我的空接收器仍然映射到各种应用程序,现在我没有声音! (2认同)
  • @ixtmixilix 当您运行“list-sink-inputs”时,请记下“sink”值。要交换回来,只需运行“pactl move-sink-input $INDEX $SINK”。类似于“pactl move-sink-input 4719 1” (2认同)

Kri*_*Dev 43

提高Waschtl回答这个线程的,所以你可以BOTH收听,录制的声音应用程序:

首先,我们查找默认输出并将其接收器名称放入$DEFAULT_OUTPUT

$ pacmd list-sinks | grep -A1 "* index"
  * index: 1
    name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
$ DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+")
$ echo $DEFAULT_OUTPUT
alsa_output.pci-0000_00_1b.0.analog-stereo
Run Code Online (Sandbox Code Playgroud)

然后,我们创建一个只有一个从站的组合接收器$DEFAULT_OUTPUT。应用程序(源)产生的声音将被转发到从接收器(即真实输出),我们也会记录它。它与不转发源声音的空接收器不同。

$ pactl load-module module-combine-sink \
  sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
  sink_properties=device.description="Record-and-Play"
Run Code Online (Sandbox Code Playgroud)

sink_properties 是可选的,如果您在描述名称中使用空格,则可能会出错。

然后,我们可以使用Waschtl answerpactl move-sink-input ...命令(使用record-n-play而不是steam),但 GUI更简单(并且非常适合检查/故障排除):pavucontrol

$ sudo apt-get install pavucontrol
$ pavucontrol &
Run Code Online (Sandbox Code Playgroud)

然后,我们在要录制的应用程序中播放一些声音。在pavucontrol Playback选项卡中,我们在应用程序下拉列表中选择:“Record-and-Play”

最后,我们很高兴可以同时录音和收听!(蹩脚的mp3 示例,在前台运行)

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"
Run Code Online (Sandbox Code Playgroud)

或者我们可以在后台录制并随时停止:

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3" \
   > /dev/null &1>/dev/null
$ killall -q parec lame
Run Code Online (Sandbox Code Playgroud)

注意:

  • 要清除所有内容或重试该过程:使用此答案删除或重置接收器。pulseaudio -k非常适合将所有内容重置为会话的默认值。
  • 如果我们更改系统声音设置中的默认输出,自定义应用程序播放设置将被覆盖,我们将不得不返回 pavucontrol 将其设置回组合界面。
  • 为了能够收听来自多个“真实”接口(例如耳机、HDMI 输出等)的声音,我们应该包括我们可能用来收听的所有“真实”输出,作为记录-播放slink 从属设备,比如:pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2

编辑:请注意,由于 Ubuntu 18(也可能是 17),组合接收器往往会成为默认的系统输出设备,而不是真正的输出设备。因此,当您使用系统托盘中的声音图标更改音量时,它会影响您录制的声音。解决方法:创建组合接收器后,pavucontrol在“输出”选项卡中打开。选择“查看:虚拟输出设备”并将组合接收器的音量重置为100%。然后选择“查看:硬件输出设备”并在真实输出设备上按绿色图标“定义为替代”。


Jac*_*nor 10

@Waschtl 的回答太棒了。@ixtmixilix 询问录制完成后是否恢复常规音频。这是我所知道的最简单的方法:

安装并运行pavucontrolGUI。您应该会在其中的Playback选项卡下看到您的音频输出应用程序和音量计。它旁边会有一个按钮,显示它正在Null Output上播放。单击它并将其更改为您的普通音频输出,在我的情况下为内置音频模拟立体声

这是您要查找的内容的屏幕截图:

截屏

在运行load-module@Waschtl 的答案中的命令创建接收器之后,您还可以使用这种方法在将来设置您的录音。


小智 7

进一步改进KrisWebDev的答案,如果您希望录制播放始终可用,请首先找出默认输出:

pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"
Run Code Online (Sandbox Code Playgroud)

这将输出如下内容:

alsa_output.pci-0000_00_1b.0.analog-stereo
Run Code Online (Sandbox Code Playgroud)

接下来,创建一个文件~/.config/pulse/default.pa

.include /etc/pulse/default.pa

load-module module-combine-sink sink_name=record-n-play slaves=alsa_output.pci-0000_00_1b.0.analog-stereo sink_properties=device.description="Record-and-Play"
Run Code Online (Sandbox Code Playgroud)

请替换alsa_output.pci-0000_00_1b.0.analog-stereo为您从pacmd命令中获得的任何输出。当自定义配置文件存在时,Pulse 不会读取默认配置文件 - 这就是上面第一行包含默认配置文件的原因。这样,pulseaudio 仍会首先加载默认配置。

运行pulseaudio -k以终止当前的pulseaudio 实例,以便使用新配置启动一个新实例。

如果您想随时撤消此处的更改,只需删除~/.config/pulse/default.pa文件并运行pulseaudio -k.

如果您希望 record-n-play 成为所有输出的默认接收器,您可以通过在 末尾添加另一行来实现~/.config/pulse/default.pa

set-default-sink record-n-play
Run Code Online (Sandbox Code Playgroud)

对于已存储信息的程序,它会记住上次使用的任何输出设备,因此您必须使用 KrisWebDev 的回答中描述的方法之一手动重新配置这些设备。


mar*_*ara 6

如果单个程序正在输出声音,您可以使用此 bash one-liner:

parec --monitor-stream  $(pacmd list-sink-inputs|tac|perl -E'undef$/;$_=<>;/RUNNING.*?index: (\d+)\n/s;say $1') --format=s16le --channels=2 --file-format=aiff newrecording.aiff
Run Code Online (Sandbox Code Playgroud)

输出好像是每分钟 10MB 左右,不要把程序静音!

我相信这是一个很好的解决方案,因为我没有下载新脚本,也不必在pulseaudio中创建新的空接收器。如果单行启动时程序没有音频输出,或者命令启动时多个程序输出音频,则应该给出奇怪的结果。

当您完成播放音频的应用程序时,parec 应该停止录制。一些编辑应用程序可能会遇到 600 分钟长的 aiff 文件的问题,如果他们尝试将其加载到 RAM 中两次。

如果应用程序停止并开始输出音频,这也是一个糟糕的解决方案。


Ram*_*ast 5

我根据@Waschtl 和@KrisWebDev 答案提供的答案创建了这个 bash 脚本。

可在此处获得:https : //gist.github.com/ramast/4be3314bc73f28f55e3604497188b007

如何使用?

$ ./pulse-recorder.bash 
    index: 225
                application.name = "ALSA plug-in [mplayer]"
                module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [mplayer]"
Choose recording index: 225
temp.mp3 file already exist, replace (y/n)? y
Run Code Online (Sandbox Code Playgroud)

新版本

我创建了一个 python 脚本,它对旧脚本进行了一些改进。 https://gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f0

如何使用?

$ ./pulse-recorder.py 

1 - ALSA plug-in [mplayer]
2 - AudioIPC Server

Please enter a number: 1

Your selection was: ALSA plug-in [mplayer]
Please press enter when you are ready to start
Run Code Online (Sandbox Code Playgroud)

当您按 Enter 时,录音将立即开始。如果在您按 Enter 键时应用程序已经停止(例如,您关闭了 mplayer),脚本将等到应用程序再次出现并开始录制。

该脚本的唯一缺点(与原始脚本相比)是,如果列表包含两个具有相同名称的条目,则脚本将无法正确运行。例如

$ ./pulse-recorder.py                                                                                                      

1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]
Run Code Online (Sandbox Code Playgroud)

编辑:这是@anarcat 脚本的改进版本

用法:

制作ogg录音

./pulse-recorder.py -i -o 'test.ogg'

制作 mp3 录音

./pulse-recorder.py -i --encoder "lame -r -q 3 --lowpass 17 --abr 192 - '%s'" -o 'test.mp3'

  • @anarcat 脚本很好,但不需要通过管道传输到 `oggenc`、`lame` 或其他编码器。使用 ffmpeg,您可以直接捕获脉冲音频设备:https://trac.ffmpeg.org/wiki/Capture/PulseAudio。这还为您提供了许多其他选项,例如分段或设置录制持续时间。 (2认同)
  • @anarcat:您有一个合并请求。请温柔一点!:) (2认同)