web-dev-qa-db-ja.com

PulseAudioでプログラムの出力を記録する

コマンドライン/ bashスクリプトを使用してPulseAudioでプログラムの出力を記録したいと思います。すべての出力を記録するのではなく、1つの特定のプログラムからの出力のみを記録することが重要です。

新しいnullシンクを作成し、プログラムの出力をこの新しいシンクに移動する必要があると考えました。 tell parecよりも、この特定のモニターを使用して記録します。

最初のステップは次のようなものです。

pactl load-module module-null-sink sink_name=Steam

しかし、プログラムの出力をこのシンクに移動する方法は?
そして、bashスクリプトを使用して特定のシンクを記録する方法は?

48
user5950

次のようなものを試してください:

ターミナルで入力

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 -

説明:

  • 最初のコマンドは、すでに知っているようにヌルシンクを追加します。
  • 2番目のコマンドは、シンク入力を標準オーディオシンクからSteamに移動します
  • 3番目のコマンドは、デバイスSteamのモニター(-d)を記録し、出力(raw-wave-stream)をoggencに入れます。oggencは、このwave-streamをoga-fileにエンコードします。 (mp3ではlameを使用)
51
Waschtl

このスレッドの 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

注意:

  • すべてを混乱させるか、手順を再試行するには: this answer を使用して、シンクを削除またはリセットします。 pulseaudio -kは、すべてをセッションのデフォルトにリセットするのに最適です。
  • システムサウンド設定でデフォルトの出力を変更すると、カスタムアプリの再生設定が上書きされるため、pavucontrolに戻って結合されたインターフェイスに戻す必要があります。
  • いくつかの「実際の」インターフェース(例えば、ヘッドフォン、HDMI出力など)から音を聞くことができるように、聞くために使用できるすべての「実際の」出力を含める必要があります record-n-playpactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2のようなスレーブをスリンクします。

編集:Ubuntu 18(おそらく17)から、結合されたシンクは実際の出力デバイスではなくデフォルトのシステム出力デバイスになる傾向があることに注意してください。そのため、システムトレイのサウンドアイコンを使用して音量を変更すると、録音サウンドに影響します。回避策:結合されたシンクを作成した後、[出力]タブでpavucontrolを開きます。 [表示:仮想出力デバイス]を選択し、結合されたシンクの音量を100%にリセットします。次に、「表示:ハードウェア出力デバイス」を選択し、実際の出力デバイスの緑色のアイコン「代替として定義」を押します。

26
KrisWebDev

@Waschtlの答えは素晴らしい。 @ixtmixilixは、録音が終了した後、通常のオーディオを復元することについて尋ねました。私が知っている最も簡単な方法は次のとおりです。

pavucontrol GUIをインストールして実行します。オーディオ出力アプリケーションが表示され、ボリュームメーターが Playback そこにタブ。 Null Outputで再生されていることを示すボタンが横に表示されます。それをクリックして、通常のオーディオ出力に変更します。私の場合はBuilt-in Audio Analog Stereoです。

探しているもののスクリーンショットは次のとおりです。

screenshot

また、@ Waschtlの回答でload-moduleコマンドを実行してシンクを作成した後、このアプローチを使用して将来的に録音を設定することもできます。

9
Jack O'Connor

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-stereopacmdコマンドから取得した出力に置き換えてください。カスタム構成ファイルが存在する場合、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の回答に記載されている方法のいずれかを使用して手動で再構成する必要があります。

6
Jonas Berlin

@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]
2
Ramast