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


49

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

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

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

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

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

回答:


52

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

ターミナルで入力

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番目のコマンドは、デバイススチームのモニター(-d)を記録し、出力(rawウェーブストリーム)をoggencに入れます。これは、このウェーブストリームをogaファイルにエンコードします。(mp3ではlameを使用)

素晴らしい、この素晴らしい答えに感謝します!:)
強制

2
この操作を元に戻す方法を説明してください。私のヌルシンクはまださまざまなアプリケーションにマップされていますが、今は音がしません!
ixtmixilix

@ixtmixilix:すべての設定をデフォルトに戻す最も簡単な方法は、pulseaudioサーバーを強制終了して再起動することです。自動スポーンに設定されている場合(これがデフォルトです)、単にpulseaudio -kターミナルで発行します。
タックカット

1
@ixtmixilix実行list-sink-inputsするときは、sink値に注意してください。スワップバックするには、単に実行しpactl move-sink-input $INDEX $SINKます。何かpactl move-sink-input 4719 1
シアラン14

27

改善Waschtlの答えあなたができるように、このスレッドのをBOTH耳を傾け、RECORDアプリの音を:

最初に、デフォルトの出力を探し、そのシンク名を$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つだけの結合されたシンクを作成します:$ DEFAULT_OUTPUT。アプリ(ソース)によって生成されたサウンドは、スレーブシンク(つまり、実際の出力)に転送され、また録音されます。ソースサウンドが転送されないヌルシンクとは異なります

$ pactl load-module module-combine-sink \
  sink_name=record-n-play slaves=$DEFAULT_OUTPUT \
  sink_properties=device.description="Record-and-Play"

sink_properties これはオプションであり、説明名にスペースを使用するとバグが発生する場合があります。

その後、我々は、使用できるpactl move-sink-input ...のコマンドWaschtlの答えを(と記録アンドプレイの代わりに、蒸気)が、GUIは、pavucontrolよりシンプル(およびトラブルシューティング/チェックするための偉大な)です。

$ sudo apt-get install pavucontrol
$ pavucontrol &

次に、録音するアプリでサウンドを再生します。ではpavucontrol Playback:タブ、我々はアプリのドロップダウンリストで選択し「レコードアンドプレイ」

最後に、録音と試聴を同時に行うのは良いことです!(ラメ 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すべてをセッションのデフォルトにリセットするのに最適です。
  • システムサウンド設定でデフォルトの出力を変更すると、カスタムアプリの再生設定が上書きされるため、pavucontrolに戻って結合されたインターフェイスに戻す必要があります。
  • いくつかの「実際の」インターフェース(ヘッドフォン、HDMI出力など)からサウンドを聞くことができるようにするには、記録と再生のスリンクスレーブとして、聞くために使用できるすべての「実際の」出力を含める必要があります。のようにpactl load-module module-combine-sink sink_name=record-n-play slaves=real-output-1,real-output-2

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


9

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

pavucontrolGUI をインストールして実行します。オーディオ出力アプリケーションがPlayback表示され、そこにあるタブの下にボリュームメーターがあります。Null Outputで再生していることを示すボタンが横に表示されます。それをクリックして、通常のオーディオ出力(私の場合はビルトインオーディオアナログステレオ)に変更します。

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

スクリーンショット

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


可能であれば、Imgurでスクリーンショットをアップロードし、回答にリンクします。
ルシオ

新しいプレイバックはデフォルトでそれを拾うていないのでこと、それが実現可能かどうかは分かりませんが、私は最善の方法は、ヌル出力モジュールをアンロードすることだと思う
ジャック

6

KrisWebDevの回答をさらに改善します。レコードアンドプレイを常に利用できるようにする場合は、最初にデフォルトの出力を見つけます。

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

set-default-sink record-n-play

pulseaudioがすでに情報を保存しているプログラムの場合、最後に使用した出力デバイスを記憶しているため、KrisWebDevの回答に記載されている方法のいずれかを使用して、手動で再構成する必要があります。


2

@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/c47bd5e57586e9c2deb74975e27089f0

使い方?

$ ./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]

複数の出力(スピーカー、複数のヘッドセット、モニターオーディオなど)がある場合、21行目を次のように置き換えることができます。default_output = alsa_output.pci-0000_00_1b.0.analog-stereoここでpacmd list -sinks
smaudet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.