【Linux】Gstreamer の使い方

| 1件のコメント

GStreamer は OSS (LGPL)の各種コーデックを搭載したマルチメディアフレームワークです。前回は ALSA の紹介をしましたが GStreamer でも alsa-library や alsa-core といった ALSA の機能を利用しています。

GStreamerのインストール

コマンドラインでコーデック機能, ファイルIO, 加工処理がプラグインによって行えます。
ストリーミングサーバとしての機能はプラグインで提供されています。本格的なストリーミングサーバを作る時は個人的には Live555 を使うことをオススメします。

プラグインは品質が高いものから good, bad, ugly に分類されています。ugly の使用にはライセンスや品質面で注意が必要です。

最新は 1.4.0(2014/07/21) で 1.x系は Stable版 となっています。
Linuxディストリビューションに初めからインストールされているのは 0.1x 系で, No Maintenanceのようです。

# centos 6.5 is already installed.
$ gst-inspect --version
gst-inspect-0.10 version 0.10.29
GStreamer 0.10.29
https://download.fedora.redhat.com/fedora
$ gst-typefind --version
gst-typefind-0.10 version 0.10.29
GStreamer 0.10.29
https://download.fedora.redhat.com/fedora
$ gst-launch --version
gst-launch-0.10 version 0.10.29
GStreamer 0.10.29
https://download.fedora.redhat.com/fedora

ubuntu 14.04では apt-get でインストールします。

# ubuntu 14.04
$ sudo apt-get install gstreamer-tools
$ gst-launch --version
gst-launch-0.10 version 0.10.36
GStreamer 0.10.36
https://launchpad.net/distros/ubuntu/+source/gstreamer0.10

GStreamerの基本機能

GStreamerを使う上で必要な基本的な機能は以下の5つです。

Source

ファイルやストリームからマルチメディアのデータを読み取る機能です。
例えば, v4l2src を使うと v4l2 を叩いてカメラから撮影した動画を取り込むことができます。

Demultiplexer

コンテナから映像データや音声データを取り出す機能です。
例えば, AVIコンテナから MotionJPEG を取り出すことができます。
逆の操作を mux と呼び ffmux_mp4 で AACデータ を MP4コンテナ に格納することもできます。

Parser

デコーダ・エンコーダに対してユニットの区切りを探してデータを分割する機能です。

Decoder

エンコードされたメディア・データの復号を行います。

Sink

メディア・データをファイルやデバイスに対して出力します。alsasink は ALSA に対して出力するプラグインです。

GStreamerを使ってみる

コマンドラインツールで gst-launch で機能を使う事ができます。
GStreamerでは pipe のような機能で処理を連結させることでメディア・データを操作します。

element

elementはマルチメディアのを処理するもので, 複数の element をつなぎ合わせて目的の機能を実現します。element を link させて chain を作成します。

pad

pad は element の入力と出力で element 間のリンクとデータフローのネゴシエーションを行うのに使われます。
マルチメディアのデータは、このpadを経由して element 間を移動します。GStreamer のデータは element 間の link に沿って一方向に流れます。source pad を経由して流れ出し, sink pad を経由して入ってくるデータを受け入れます。

state

PLAYING は処理を行っている状態, PAUSED はデータの入出力が開始できる状態, READY は初期化が終了しメモリが確保された状態 , NULL はメモリが確保されていない状態です。

event

EOS はファイルの最後に到達した時のイベント, SEEK は処理中のデータで別の位置にジャンプするときに発生するイベントです。

gst-launch を使ってみます。 以下でテスト音声 (440Hz) が再生されます。

$ gst-launch  audiotestsrc ! autoaudiosink

テスト映像を再生します。

$ gst-launch-1.0 videotestsrc ! autovideosink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
^Chandling interrupt.
Interrupt: Stopping pipeline ...
Execution ended after 0:00:47.024123809
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...

gst-launch_test

gstreamer-conference-2014は10月にドイツで開催されるようです。


[1] cgit.freedesktop.org/gstreamer
[2] 開発リファレンスの日本語訳