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


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からであろうと別の方法であろうと、オーディオシステムの残りの部分は常に混乱します。
2016年

わかりませんが、あなたは正しい方向に進んでいると思います。の出力はpacmd list、特定のプログラムに接続されているソースとシンクを示しているため、それらを変更する方法がある場合があります。lists.freedesktop.org/mailman/listinfo/pulseaudio-discussPulseAudioリストを尋ねてみてください。メンテナ/開発者はそこにいて、非常に役に立ちます。
Joe、

@Joeシンクの再割り当てはpacmdで可能です、はい、ただし、オーディオは実際に再生を開始したときにのみ割り当てられるため(少なくとも一部のプログラムではFirefox)、つまり、タイトなループでそれらを検索する必要があり、オーディオの最初の0.5秒程度。メーリングリストに関するヒントをありがとう。:-)
誰も

回答:


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シンクを完全に置き換えることができます。これで十分でない場合は、独自の使い捨てパルスオーディオサーバーを実行してください。

このページ(/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

今、私は愚かだと感じています。ありがとう。^^最終的には最初にドキュメントを読むことを学びます。
2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.