使用 PulseAudio 记录程序的输出

使用 PulseAudio 记录程序的输出

我想用以下方法记录程序的输出:脉冲音频使用命令行/bash 脚本。重要的是不要记录所有输出,而只记录一个特定程序的输出。

我认为我必须创建一个新的空接收器,然后将程序的输出移动到这个新接收器。然后告诉帕雷克使用此特定的监视器进行录制。

第一步应该是这样的:

pactl load-module module-null-sink sink_name=steam

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

答案1

尝试这样的操作:

在终端输入

pacmd

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

list-sink-inputs

(在这里您可以获得正在运行的输入的索引)现在找到输入的索引。现在称为 $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 -

解释:

  • 正如您所知,第一个命令将添加一个 null-sink。
  • 第二条命令将接收器输入从标准音频接收器移至 steam
  • 第三个命令记录设备蒸汽的监视器(-d),并将输出(原始波形流)放入oggenc,后者将此波形流编码为oga文件。(对于mp3使用lame)

答案2

改进Washchtl 回答这个线程,所以你可以聆听与记录并存应用程序声音:

首先,我们寻找默认输出并将其接收器名称输入$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

然后我们创建一个组合水槽只有一个从属:默认输出。应用程序(源)生成的声音将被转发到从属接收器(即实际输出),我们还将录制它。它不同于零汇源声音未被转发。

$ pactl load-module module-combine-sink \
  sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
  sink_properties=device.description="Record-and-Play"

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

然后我们可以使用pactl move-sink-input ...命令Washchtl 回答(和錄音代替蒸汽)但 GUIpavucontrol更简单(并且非常适合检查/故障排除):

$ sudo apt-get install pavucontrol
$ pavucontrol &

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

最后,我们可以同时录音和聆听了!(mp3 示例,在前台运行)

$ parec --format=s16le -d record-n-play.monitor | \
  lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"

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

$ 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

注意:

  • 要清除所有杂乱或重试该过程:使用以下方法删除或重置水槽这个答案.pulseaudio -k可以很好地将所有内容重置为会话的默认值。
  • 如果我们在系统声音设置中更改默认输出,自定义应用程序播放设置将被覆盖,我们将不得不返回 pavucontrol 将其设置回组合界面。
  • 为了能够从多个“真实”接口(例如耳机、HDMI 输出等)收听声音,我们应该包括所有可能用来收听的“真实”输出,因为錄音潜行的奴隶,例如:pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2

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

答案3

@Waschtl 的回答很棒。@ixtmixilix 询问了录制结束后如何恢复常规音频。这是我所知道的最简单的方法:

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

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

截屏

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

答案4

我根据@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

新版本

我创建了一个 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

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

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

$ ./pulse-recorder.py                                                                                                      

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

编辑:这是一个改良版@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'

相关内容