音楽再生アプリケーションといえば、iTunesのようなGUIを想像しがちだが、こと"再生"するだけならGUIは必要ない。ファイルやプレイリストを指定し、延々と再生し続けてくれれば用は足りるし、曲送り/戻しや音量調整もボタンのクリックではなくキーボードを押す方法でかまわない。オーディオファン目線でいえば、音質に勝るものなし、MacにUSB DACをつなぎ「afplay」で音楽を聴くという剛の者もいる。GUIは本質ではないのだ。
「GStreamer」というライブラリをご存知だろうか? 音声/映像の再生からストリーミングなど通信関連まで、多種多様な機能を提供するオープンソースのマルチメディアフレームワークだ。macOSのほかLinux、Windowsなど多様なOSで動作するが、プラットフォームに依存するレイヤーが切り分けられているため、移植性の高いマルチメディアアプリケーションを開発できる利点がある。
このGStreamer、CUIフロントエンドも用意されている。位置付けとしては開発支援ツールであり、一般ユーザが日常的に使う類いのものではないが、複数の機能要素をつなぎ独自の処理を行うことができるのだ。bashなどのシェルには、コマンドAの結果をコマンドBに引き継がせる「パイプ」という機能があるが、それを映像/音声処理で実現すると考えれば理解しやすいはず。
筆者がGStreamerを必要とした理由も、そのパイプライン機構にある。macOSに付属の「afplay」は多用なコーデックに対応してはいるものの、デコードした内容を標準出力へ書き出す機能がなく、パイプで他のコマンドに処理を引き継ぐことができない。FLACやAACをデコードした結果(リニアPCMデータ)を他のコマンドでフィルタ処理しようとしても、そのままCoreAudioに渡されてしまうのだ。
しかし、GStreamerを使えば、そのような処理もかんたんにできてしまう。以下のコマンド実行例では、プレインテキスト(dummy.txt)を「fdsink」プラグインを使い、標準出力へアウトプットしている(テキストも扱えるのだ)。「cat dummy.txt」の回りくどい実行例と映るかもしれないが、プレインテキストをサウンドファイルへ置き換え、「fdsink」を他の音声処理系プラグインに置き換えたとしたら? この処理系の面白さが想像できると思う。
$ gst-launch-1.0 -q filesrc location=dummy.txt ! fdsink
GStreamerの準備
GStreamerの導入には、パッケージマネージャー「Homebrew」を利用する。GStreamer自体はライブラリであり、Terminalから利用することはできないため、あわせて「gst-plugins-base」(基本プラグイン集)と「gst-plugins-good」(LGPLで再配布できるプラグイン集)も導入しておこう。
$ brew install gstreamer
$ brew install gst-plugins-base
$ brew install gst-plugins-good
インストールが完了したら、付属の「gst-launch-1.0」コマンドを使い音を出してみよう。音源は用意する必要なし、指定した波形の音(デフォルトはサイン波/440Hz)を出力する「audiotestsrc」プラグインと、オーディオデバイスを自動検出し出力する「autoaudiosink」プラグインを「!」で接続すればいい。ポーッという音がMacの内蔵スピーカーから聞こえれば成功だ(Ctrl-Cでストップ)。
$ gst-launch-1.0 audiotestsrc ! autoaudiosink
オーディオファイルの再生もお手のもの。以下のコマンド実行例では、「filesrc」プラグインでサウンドファイル(FLAC)を指定し、サウンドファイルの種別を判定し適切なデコーダを見つけてくれるプラグイン「decodebin」に処理を渡し、続いてオーディオフォーマットを出力用に調整するプラグイン「audioconvert」に、最後に前述したプラグイン「autoaudiosink」で出力する、という処理をワンラインで実現している。
$ gst-launch-1.0 filesrc location=audio.flac ! decodebin ! audioconvert ! autoaudiosink
これだけでは「afplay」と処理内容は変わらないが、最終段「autoaudiosink」の直前にユニークな処理を行うプラグインを挿入するとどうなるか。たとえば、センターチャネルからボーカルを取り除くプラグイン「audiokaraoke」。これでボーカルの音量はぐっと低減され、カラオケのような音になる。
$ gst-launch-1.0 filesrc location=audio.flac ! decodebin ! audioconvert ! audiokaraoke ! autoaudiosink
「audiopanorama」プラグインもおもしろい。「panorama=XXX」の要領で-1から1の範囲で引数を与えると、左右チャンネルに音の中心をパンニングできる。以下のコマンド実行例では、引数を0.5として右チャンネル側に寄せているため、ヘッドホンで聴けば音像の中心が右側に45度ほどずれて感じるはずだ。
$ gst-launch-1.0 filesrc location=audio.flac ! decodebin ! audioconvert ! audiopanorama panorama=0.50 ! autoaudiosink
ローパス/ハイパスフィルタとして使える「audiowsinclimit」も試してみよう。ローパスフィルタとして使う場合は、引数に「mode=low-pass cutoff=200」などと与えて実行すれば、指定した周波数(この場合200Hz)以下を通す処理もかんたんに実行できる。なお、デフォルトでは音量が小さいため、最大になるよう「volume volume=1」を追加している。
$ gst-launch-1.0 filesrc location=audio.flac ! decodebin ! audioconvert ! audiowsinclimit mode=low-pass cutoff=200 ! volume volume=1 ! autoaudiosink
このように、プラグインを"つなぐ"ことでさまざまな処理を行うことができるGStreamerは、音楽好きならば結構遊べること間違いなし。次回は、動画を素材とした活用事例を紹介してみよう。