試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PulseAudio上の録音に関する覚え書き(オーディオストリームの録音)

ここでは、PulseAudio上の録音を行う方法の内、付属のparecコマンドを用いてオーディオストリームを録音する方法についてを扱う。
あまり実用的とは言えないかもしれないが、ここで扱う録音の要領は、別記事で扱う他の録音方法でも使える。

  1. 出力される音(Sinkのモニタ)を録音する
  2. 入力(Source)を録音する
  3. ストリームの再生
  4. RAWオーディオからWAVEへの変換

出力される音(Sinkのモニタ)を録音する

-dオプションで、出力先デバイスのモニタデバイスを指定する。

$ parec -d alsa_output.default.monitor
(Ctrl+Cを押すと停止)

上の例ではALSAへの出力を行っているが、この部分のモニタデバイスの名前は

$ pactl list | grep monitor
Name: alsa_output.default.monitor

のようにして調べておく。
もし、設定ファイルdefault.pa複数のSinkモジュールを使用していなければ、モニタデバイスは1つになるので

$ parec -d $(pactl list | grep monitor | cut -d " " -f 2) > audio.raw

のように実行する手もある。*1
(2009/5/24)PulseAudioのバージョン0.9.15の時点では「monitor」を含む行を取り出しても

$ pactl --version
pactl 0.9.15
Compiled with libpulse 0.9.15
Linked with libpulse 0.9.15
$ pactl list | grep monitor                            
        Monitor Source: jack_out.monitor
        Name: jack_out.monitor
                device.class = "monitor"
$ pactl list | grep monitor | cut -d " " -f 2
Source:
jack_out.monitor
=

のように名前の部分だけをうまく取り出せないため

$ pactl list | grep "Monitor Source:" | cut -d " " -f 3           
jack_out.monitor
$ pactl list | grep "Name:.*.monitor" | cut -d " " -f 2
jack_out.monitor

少し取り出し方を変えてみるとうまくいく。

入力(Source)を録音する

Sourceを録音する場合、特にオプションは付けない。

$ parec > audio.raw
(Ctrl+Cを押すと停止)

ストリームの再生

-pオプションでファイルを指定してpacatコマンドを実行すると、保存したストリームを再生できる。

$ pacat -p audio.raw

このとき、pacatは、PulseAudioアプリケーションとして音を出すため、PulseAudioのデーモンが動作している必要がある。

RAWオーディオからWAVEへの変換

(2009/5/24)
www.outflux.net/blog/archives/2009/04/19/recording-from-pulseaudio/
を見ると、soxという変換ツールでWAVE形式に変換することができるようだ。

(2015/1/10)バージョン4.0時点ではWAVE形式で直接保存ができるため、変換が必要な場面はあまりないと思われる。

使用したバージョン:

  • PulseAudio 0.9.10(0.9.10-r51)

*1:複数のSinkモジュールを使用しているとき、使用されていないほうのSinkモジュールのモニタデバイスを選択すると、録音が正しく行われない