GStreamer の gst-launch-1.0 を使ってみる

GStreamer-1.0.2 のように Version 1.0 系になった。これまで使ったことがなかったのですが、音楽関係で遊んでみようと思い、触ってみることにした。環境は Fedora 18 alpha と Momonga trunk です。メインの Momonga はオーディオやカメラ機器を取り付けなければならないので、基本的に Ultra Book で試しています。

今回は、コマンドラインで遊びます。参考にしたのは http://www.clear-code.com/blog/2010/1/11.htmlhttp://oss.infoscience.co.jp/gstreamer/ です。

まず、はじめにオーディオ関係からテスト。GStreamer でテスト音源をスピーカー出力してみます。最初にテスト音源を探します。

$ gst-inspect-1.0 | grep test | grep audio
audiotestsrc:  audiotestsrc: Audio test source

ここで使った gst-inspect-1.0 というのは、 GStreamer で利用できるエレメント(音源とかフィルタとか出力とか)を調べるプログラムです。引数なしの場合は、全部出力してくれます。音源の場合は src というものが付きます。

次に、デフォルトの出力を探します。

$ gst-inspect-1.0 | grep sink | grep audio
ossaudio:  osssink: Audio Sink (OSS)
pulseaudio:  pulsesink: PulseAudio Audio Sink
inter:  interaudiosink: Internal audio sink
autodetect:  autoaudiosink: Auto audio sink
jack:  jackaudiosink: Audio Sink (Jack)

基本的に、自動検出したものを使うのが楽でしょう。この sink というのが出力です。

という状態で、テスト音源を自動検出したオーディオに出力してみます。入出力をパイプでつなぐのですが、 Shell のパイプ "|" ではなく "!" というビックリマークを使います。中止は Ctrl+C です。

$ gst-launch-1.0 audiotestsrc ! autoaudiosink
パイプラインを一時停止 (PAUSED) にしています...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
パイプラインを再生中 (PLAYING) にしています...
New clock: GstPulseSinkClock
^CCaught interrupt -- handling interrupt.
割り込み: パイプラインを停止しています...
Execution ended after 1502238697 ns.
パイプラインを一時停止 (PAUSED) にしています...

440Hzの音が聞こえましたか?

次は ビデオ信号を出力してみます。まずは、入出力の調査から。

$ gst-inspect-1.0 | grep test | grep video
videotestsrc:  videotestsrc: Video test source
$ gst-inspect-1.0 | grep sink | grep video
debugutilsbad:  fpsdisplaysink: Measure and show framerate on videosink
inter:  intervideosink: Internal video sink
autodetect:  autovideosink: Auto video sink
video4linux2:  v4l2sink: Video (video4linux2) Sink

テスト信号を videotestsrc 出力を autovideosink にしてテストします。終了は、 Ctrl+C または、モニタウィンドウを閉じます。

$ gst-launch-1.0 videotestsrc ! autovideosink
パイプラインを一時停止 (PAUSED) にしています...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
パイプラインを再生中 (PLAYING) にしています...
New clock: GstSystemClock
ERROR: from element /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstXvImageSink:autovideosink0-actual-sink-xvimage: Output window was closed
追加のデバッグ情報:
xvimagesink.c(820): gst_xvimagesink_handle_xevents (): /GstPipeline:pipeline0/GstAutoVideoSink:autovideosink0/GstXvImageSink:autovideosink0-actual-sink-xvimage
Execution ended after 2001496162 ns.
パイプラインを一時停止 (PAUSED) にしています...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

さて、 ASUS の Ultra Book には、マイクとカメラとスピーカーとモニタがあり、これらは全て自動検出されます。入力から出力に単純につなぐとマイク入力をスピーカーに、カメラ入力をモニタに出力できます。自動検出なので auto で gst-inspect-1.0 の出力を検索してみます。

$ gst-inspect-1.0 | grep auto
autoconvert:  autovideoconvert: Select color space convertor based on caps
autoconvert:  autoconvert: Select convertor based on caps
autodetect:  autoaudiosrc: Auto audio source
autodetect:  autoaudiosink: Auto audio sink
autodetect:  autovideosrc: Auto video source
autodetect:  autovideosink: Auto video sink

入力は src 出力は sink なので、オーディオは autoaudiosrc と autoaudiosink、ビデオは autovideosrc と autovideosink につないでみます。

$ gst-launch-1.0 autoaudiosrc ! autoaudiosink
…
$ gst-launch-1.0 autovideosrc ! autovideosink
…

手元では、ビデオリフレッシュが遅いなんて警告が出ますが、 Cheese みたいなことが簡単にできました。

プログラムを書かなくても簡単に使えて楽しそうなので、どんなことができるのがちょっと調べる予定です。ただし、主にオーディオ関係だけですけどね。