使用PulseAudio记录程序的输出


49

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

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

第一步将是这样的:

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

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

Answers:


52

尝试这样的事情:

在终端中输入

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 -

说明:

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

太棒了,非常感谢您的出色回答!:)
强制

2
您能解释一下如何撤消此操作吗?我的空接收器仍然映射到各种应用程序,现在我没有声音了!
ixtmixilix 2012年

@ixtmixilix:将所有设置恢复为默认设置的最简单方法是杀死并重新启动Pulseaudio服务器。如果设置为自动生成(这是默认设置),则只需pulseaudio -k在终端中发出。
塔卡特

1
@ixtmixilix运行时list-sink-inputs请记下该sink值。要交换回来,只需运行pactl move-sink-input $INDEX $SINK。像pactl move-sink-input 4719 1
Ciaran

27

改善此线程的Waschtl答案,以便您既可以收听又可以记录应用程序的声音:

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

然后,我们创建一个只有一个从属的组合接收器$ DEFAULT_OUTPUT。应用程序(源)生成的声音将被转发到从属接收器(即实际输出),我们还将对其进行记录。它不同于不转发源声音的空接收器

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

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

然后,我们可以使用Waschtl Answer的pactl move-sink-input ...命令(用record-n-play代替steam),但是GUI 更简单(并且非常适合检查/解决问题):pavucontrol

$ sudo apt-get install pavucontrol
$ pavucontrol &

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

最后,我们很高兴同时录制和收听!(la脚的 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输出等)的声音,我们应该将所有我们可以用来收听的“真实”输出作为记录n播放的从属从属设备。 ,如:pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2

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


9

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

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

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

屏幕截图

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


如果可以,请在Imgur中上传屏幕截图并将其链接到您的答案中。
Lucio

我不知道这是否可行,但我认为最好的方法是卸载null输出模块,以便默认情况下不会播放新的回放
杰克

6

如果您想一直提供record-n-play的功能,请进一步改善KrisWebDev的答案,首先找出默认输出:

pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"

这将输出类似:

alsa_output.pci-0000_00_1b.0.analog-stereo

接下来,创建一个文件~/.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"

请替换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

对于Pulseaudio已经存储了信息的程序,它会记住它们最后使用的输出设备,因此您必须使用KrisWebDev答案中描述的方法之一手动重新配置这些设备。


2

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

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

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

$ ./pulse-recorder.py                                                                                                      

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

如果您有多个输出(例如扬声器,多个耳机,监听音频),则可以在第21行上将其替换为:default_output = alsa_output.pci-0000_00_1b.0.analog-stereo,其中这是来自pacmd列表的输出下沉
smaudet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.