以编程方式将特定程序的音频输出重定向到文件


8

我想在命令行上将程序的音频输出重定向到文件,例如在

$ redirect-wrapper file.wav my-program

以便

  • 我听不到程序的输出,即输出应转到文件
  • 除了程序之外,我什么都没记录,即只有该特定程序被重定向到文件
  • 音频系统的其余部分完全不受干扰,没有来回更改任何配置选项或类似的操作

有没有办法做到这一点?相关的问题并没有帮助,我需要一个命令行的解决方案,也没有“点击那里,再有”。可能也是相关的,但也依赖于图形应用程序pavucontrol。我找到了pavucontrol,pacmd的终端替代品。

但这仍然只能使以下折衷成为可能:

  1. 获取默认接收器并保存它是什么。怎么样?大概通过pacmd list-sinks
  2. 使用将默认接收器设置为snd-aloop接收器pacmd set-default-sink
  3. 从该接收器记录。
  4. 启动程序
  5. 等待应用程序打开其接收器输入:pacmd list-sink-inputs | grep name-of-my-program如果找到接收器,则输入已打开。
  6. 将默认值改回原来的状态pacmd set-default-sink
  7. 应用程序关闭后,停止记录。

但这仍会更改默认接收器长达几分钟的时间(接收器输入通常不会打开,直到程序实际播放声音后才启动它)。我实施了这个折衷方案;Github

仍在寻找不妥协的答案。


这可能会有所帮助:swview.org/node/213他正在临时更改~/.asoundrc。也许您可以以某种方式避免这种情况。
rudimeier

@rudimeier这是全局设置默认输出设备。不管是从〜/ .asoundrc还是以其他方式,它将始终使音频系统的其余部分混乱。
没人

不知道,但我认为您的做法正确。的输出pacmd list显示了将哪些源和接收器附加到特定程序,因此可能有一种更改它们的方法。尝试在list.freedesktop.org/mailman/listinfo/pulseaudio-discuss上询问pulseaudio列表。维护人员/开发人员在那儿,非常有帮助。

@Joe可以使用pacmd重新分配接收器,是的,但是因为只有在音频实际开始播放时才分配接收器(至少对于某些程序; Firefox),这意味着我将需要在紧密的循环中搜索它们,并且可能会错过音频的前0.5秒左右。感谢您提供有关邮件列表的提示。:-)
没人

Answers:


2

嗯,所以看一下pulseaudio文档。

man pulseaudio

我们有以下环境变量

   $PULSE_SERVER: the server string specifying the server to connect to when a client asks for a sound server connection  and  doesn't  explicitly  ask  for  a  specific
   server.  The server string is a list of server addresses separated by whitespace which are tried in turn. A server address consists of an optional address type speci‐
   fier (unix:, tcp:, tcp4:, tcp6:), followed by a path or host address. A host address may include an optional port number. A server address may be prefixed by a string
   enclosed in {}. In this case the following server address is ignored unless the prefix string equals the local hostname or the machine id (/etc/machine-id).

   $PULSE_SINK: the symbolic name of the sink to connect to when a client creates a playback stream and doesn't explicitly ask for a specific sink.

希望这可以让您完全更换PulseAudio接收器,如果还不够,请运行我们自己的一次性使用PulseAudio服务器。

参考此页面(/ubuntu/60837/record-a-programs-output-with-pulseaudio),我们发现了有关parec/ pacat命令(它们是别名)的信息,该命令可以记录和写入接收器和溪流。

放在一起,我们得到以下包装器(我实际上没有运行过-尽管我已经成功地使这种方法临时使用)

sink_name="sink-$(date +%s)"
pacat $sink_name.monitor 
parec -d steam.monitor | oggenc -b 192 -o /tmp/steam.ogg --raw - &
pid=$!
PULSE_SINK=$sink_name "$@"
kill $pid

现在我觉得很蠢。谢谢。最终,我将首先学习阅读文档。
没人
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.