【Linux】Gstreamerの使い方【Multimedia】

| 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 already install.
$ gst-inspect --version
gst-inspect-0.10 version 0.10.29
GStreamer 0.10.29
http://download.fedora.redhat.com/fedora
$ gst-typefind --version
gst-typefind-0.10 version 0.10.29
GStreamer 0.10.29
http://download.fedora.redhat.com/fedora
$ gst-launch --version
gst-launch-0.10 version 0.10.29
GStreamer 0.10.29
http://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をスクリプトから動かす

pygstベースの Python Bindings プラグインをインストールします。


$ sudo apt-get install python-gst0.10

先ほどコマンドで再生したテスト音声をスクリプトから再生します。


#!/usr/bin/python

import pygst
pygst.require("0.10")
import gst
import pygtk
import gtk

class Main:
	def __init__(self):
                # Pipelineを作成
		self.pipeline = gst.Pipeline("mypipeline")
                # Source を Pipeline に追加
		self.audiotestsrc = gst.element_factory_make("audiotestsrc", "audio")
		self.pipeline.add(self.audiotestsrc)
                # Sink にALSAを指定します
		self.sink = gst.element_factory_make("alsasink", "sink")
		self.pipeline.add(self.sink)
                # Source に Sink を Linkします
		self.audiotestsrc.link(self.sink)
                # state を PLAYINGに設定します
		self.pipeline.set_state(gst.STATE_PLAYING)

start=Main()
gtk.main()

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


[1] Gitリポジトリ
[2] 開発リファレンスの日本語訳

1件のコメント

  1. 0.10はnomaintenance。

コメントを残す

必須欄は * がついています