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

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

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

$ 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. 应用程序关闭后停止录制。

但这仍然会在长达几分钟的时间跨度内更改默认接收器(接收器输入通常不会打开,直到程序实际播放声音,而无需在启动后立即打开)。我实施了这个妥协;吉图布

仍在寻找不妥协的答案。

答案1

嗯,看一下pulsaudio文档。

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服务器。

参考此页面(https://askubuntu.com/questions/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

相关内容