web-dev-qa-db-ja.com

特定のプログラムのオーディオ出力をプログラムでファイルにリダイレクトする

次のように、コマンドラインでプログラムのオーディオ出力をファイルにリダイレクトしたい

$ redirect-wrapper file.wav my-program

そのため

  • プログラムの出力が聞こえません。つまり、出力はonlyファイルに移動する必要があります
  • プログラム以外は何も記録しません。つまり、この特定のプログラムのみがファイルにリダイレクトされます
  • オーディオシステムの残りの部分はまったく影響を受けず、前後に変更された構成オプションはありません。

これを行う方法はありますか? これ 関連する質問は助けにはなりませんヘルプ、コマンドラインソリューションが必要です。 This も関連している可能性がありますが、グラフィカルアプリケーションpavucontrolにも依存しています。 pavucontrol、pacmdに代わる端末を見つけました。

しかし、これはまだ次の妥協を可能にするだけです:

  1. デフォルトのシンクを取得し、それを保存します。どうやって?おそらくpacmd list-sinks
  2. pacmd set-default-sinkを使用して、デフォルトのシンクをsnd-aloopシンクに設定します。
  3. そのシンクから記録します。
  4. アプリケーションを起動する
  5. アプリケーションがシンク入力を開くまで待ちます:pacmd list-sink-inputs | grep name-of-my-programこれが何かを見つけた場合、入力は開いています。
  6. デフォルトをpacmd set-default-sinkでのデフォルトに戻します。
  7. アプリケーションが閉じたら記録を停止します。

ただし、これにより、デフォルトのシンクが数分までの期間で変更されます(通常、プログラムが実際にサウンドを再生するまで、シンクの入力は開かれません。サウンドは、起動直後にある必要はありません)。この妥協案を実装しました。 Github

妥協のない答えを探しています。

8
Nobody

ええと、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サーバーを実行してください。

このページ( 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
2
Att Righ