コマンドライン/ bashスクリプトを使用してPulseAudioでプログラムの出力を記録したいと思います。すべての出力を記録するのではなく、1つの特定のプログラムからの出力のみを記録することが重要です。
新しいnullシンクを作成し、プログラムの出力をこの新しいシンクに移動する必要があると考えました。 tell parecよりも、この特定のモニターを使用して記録します。
最初のステップは次のようなものです。
pactl load-module module-null-sink sink_name=Steam
しかし、プログラムの出力をこのシンクに移動する方法は?
そして、bashスクリプトを使用して特定のシンクを記録する方法は?
次のようなものを試してください:
ターミナルで入力
pacmd
(これはPulseAudio-ServerのCLIです)次に使用します
list-sink-inputs
(実行中の入力のインデックスを取得します)次に、入力のインデックスを見つけます。現在は$ INDEXと呼ばれています
スクリプト可能な部分は次のとおりです。
pactl load-module module-null-sink sink_name=Steam
pactl move-sink-input $INDEX Steam
parec -d Steam.monitor | oggenc -b 192 -o Steam.ogg --raw -
このスレッドの Waschtl answer を改善して、アプリの音を聞く/録音するできるようにします。
最初に、デフォルトの出力を探し、そのシンク名を$DEFAULT_OUTPUT
に入れます。
$ pacmd list-sinks | grep -A1 "* index"
* index: 1
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
$ DEFAULT_OUTPUT=$(pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+")
$ echo $DEFAULT_OUTPUT
alsa_output.pci-0000_00_1b.0.analog-stereo
次に、スレーブが1つしかない combined sink を作成します:$ DEFAULT_OUTPUT。アプリ(ソース)によって生成されたサウンドは、スレーブシンク(つまり、実際の出力)に転送され、また録音されます。ソースサウンドが転送されない null sink とは異なります。
$ pactl load-module module-combine-sink \
sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
sink_properties=device.description="Record-and-Play"
sink_properties
はオプションであり、説明名にスペースを使用するとバグが発生する場合があります。
次に、 Waschtl answer (withrecord-n-play)の代わりにSteamのpactl move-sink-input ...
コマンドを使用できます。 )しかし、GUI pavucontrol
はよりシンプルです(チェック/トラブルシューティングに最適です):
$ Sudo apt-get install pavucontrol
$ pavucontrol &
次に、録音するアプリでサウンドを再生します。 pavucontrol
Playback タブでは、アプリのドロップダウンリストで "Record-and-Play" を選択します。
最後に、録音と試聴を同時に行うのは良いことです! ( lame mp3の例、フォアグラウンドで実行)
$ parec --format=s16le -d record-n-play.monitor | \
lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3"
または、バックグラウンドで記録して、いつでも停止できます。
$ parec --format=s16le -d record-n-play.monitor | \
lame -r --quiet -q 3 --lowpass 17 --abr 192 - "temp.mp3" \
> /dev/null &1>/dev/null
$ killall -q parec lame
注意:
pulseaudio -k
は、すべてをセッションのデフォルトにリセットするのに最適です。pactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2
のようなスレーブをスリンクします。編集:Ubuntu 18(おそらく17)から、結合されたシンクは実際の出力デバイスではなくデフォルトのシステム出力デバイスになる傾向があることに注意してください。そのため、システムトレイのサウンドアイコンを使用して音量を変更すると、録音サウンドに影響します。回避策:結合されたシンクを作成した後、[出力]タブでpavucontrol
を開きます。 [表示:仮想出力デバイス]を選択し、結合されたシンクの音量を100%にリセットします。次に、「表示:ハードウェア出力デバイス」を選択し、実際の出力デバイスの緑色のアイコン「代替として定義」を押します。
@Waschtlの答えは素晴らしい。 @ixtmixilixは、録音が終了した後、通常のオーディオを復元することについて尋ねました。私が知っている最も簡単な方法は次のとおりです。
pavucontrol
GUIをインストールして実行します。オーディオ出力アプリケーションが表示され、ボリュームメーターが Playback そこにタブ。 Null Outputで再生されていることを示すボタンが横に表示されます。それをクリックして、通常のオーディオ出力に変更します。私の場合はBuilt-in Audio Analog Stereoです。
探しているもののスクリーンショットは次のとおりです。
また、@ Waschtlの回答でload-module
コマンドを実行してシンクを作成した後、このアプローチを使用して将来的に録音を設定することもできます。
KrisWebDev の回答をさらに改善します。record-n-playを常に使用可能にするには、最初にデフォルトの出力を見つけます。
pacmd list-sinks | grep -A1 "* index" | grep -oP "<\K[^ >]+"
次のようなものが出力されます:
alsa_output.pci-0000_00_1b.0.analog-stereo
次に、ファイル~/.config/Pulse/default.pa
を作成します。
.include /etc/Pulse/default.pa
load-module module-combine-sink sink_name=record-n-play slaves=alsa_output.pci-0000_00_1b.0.analog-stereo sink_properties=device.description="Record-and-Play"
alsa_output.pci-0000_00_1b.0.analog-stereo
をpacmd
コマンドから取得した出力に置き換えてください。カスタム構成ファイルが存在する場合、Pulseはデフォルト構成ファイルを読み取りません。そのため、上記の最初の行にデフォルト構成ファイルが含まれています。こうすることで、pulseaudioはデフォルト設定を最初にロードします。
pulseaudio -k
を実行して現在のpulseaudioインスタンスを強制終了し、新しい設定で新しいインスタンスを開始します。
ここで変更を元に戻したい場合は、~/.config/Pulse/default.pa
ファイルを削除してpulseaudio -k
を実行してください。
Record-n-playをすべての出力のデフォルトシンクにしたい場合は、~/.config/Pulse/default.pa
の最後にさらに1行追加することでそれを行うことができます。
set-default-sink record-n-play
Pulseaudioがすでに情報を保存しているプログラムの場合、最後に使用した出力デバイスを記憶しているため、KrisWebDevの回答に記載されている方法のいずれかを使用して手動で再構成する必要があります。
@Waschtlおよび@KrisWebDevの回答によって提供される回答に基づいて、このbashスクリプトを作成しました。
ここで利用可能: https://Gist.github.com/ramast/4be3314bc73f28f55e3604497188b007
使い方?
$ ./Pulse-recorder.bash
index: 225
application.name = "ALSA plug-in [mplayer]"
module-stream-restore.id = "sink-input-by-application-name:ALSA plug-in [mplayer]"
Choose recording index: 225
temp.mp3 file already exist, replace (y/n)? y
古いスクリプトを改良したpythonスクリプトを作成しました。 https://Gist.github.com/ramast/c47bd5e57586e9c2deb74975e27089f
使い方?
$ ./Pulse-recorder.py
1 - ALSA plug-in [mplayer]
2 - AudioIPC Server
Please enter a number: 1
Your selection was: ALSA plug-in [mplayer]
Please press enter when you are ready to start
Enterキーを押すと、すぐに録音が開始されます。 Enterキーを押すまでにアプリケーションが既に停止している場合(つまり、mplayerを閉じた場合など)、スクリプトはアプリケーションが再び表示されて記録を開始するまで待機します。
そのスクリプト(元のスクリプト)に対する唯一の欠点は、リストに同じ名前の2つのエントリが含まれていると、スクリプトが正しく動作しないことです。例えば
$ ./Pulse-recorder.py
1 - ALSA plug-in [mplayer]
2 - ALSA plug-in [mplayer]