![以编程方式将特定程序的音频输出重定向到文件](https://linux22.com/image/98564/%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E5%B0%86%E7%89%B9%E5%AE%9A%E7%A8%8B%E5%BA%8F%E7%9A%84%E9%9F%B3%E9%A2%91%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E6%96%87%E4%BB%B6.png)
我想在命令行上将程序的音频输出重定向到文件,例如
$ redirect-wrapper file.wav my-program
以便
- 我没有听到程序的输出,即输出应该是仅有的转到文件
- 除了节目之外我不记录任何东西,即只记录这个具体的程序被重定向到文件
- 音频系统的其余部分完全不受干扰,没有来回更改配置选项或类似的东西
有没有办法做到这一点?这相关问题确实不是帮助,我需要一个命令行解决方案,而不是“单击那里,然后那里”。这大概也有关系,而且还依赖于图形应用程序pavucontrol。我找到了 pavucontrol 的终端替代品 pacmd。
但这仍然只能使以下妥协成为可能:
- 获取默认接收器并保存它的内容。如何?可能正在摸索
pacmd list-sinks
- 将默认接收器设置为 snd-aloop 接收器
pacmd set-default-sink
。 - 从那个水槽记录。
- 启动程序
- 等待应用程序打开其接收器输入:
pacmd list-sink-inputs | grep name-of-my-program
如果发现某些内容,则输入已打开。 - 将默认值更改回原来的值
pacmd set-default-sink
。 - 应用程序关闭后停止录制。
但这仍然会在长达几分钟的时间跨度内更改默认接收器(接收器输入通常不会打开,直到程序实际播放声音,而无需在启动后立即打开)。我实施了这个妥协;吉图布。
仍在寻找不妥协的答案。
答案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