はじめに1
はじめまして、アイベックステクノロジーの加藤です。 本連載記事では、OSS の マルチメディアフレームワークである GStreamer についてご紹介していきます。 連載第1回ということで、今回は GStreamer とは一体なんなのかというところから説明させていただきます。
GStreamer とは
GStreamer は、オープンソース(ライセンスは LGPL2)で開発されているマルチメディアフレームワークです。
ここでマルチメディアとは、動画、音声、静止画、字幕などといったコンテンツのことです。
また、ここでのフレームワークとは、ソフトウェアによってシステムを構築するための基本的な仕組みのことです。 特に、一般的な機能や抽象概念を用意してくれていて、それに合わせて必要な機能にかかわる小さな部分だけを実装すれば複雑なアプリケーションを実現できるようなもののことを、フレームワークと呼ぶことが多いようです。
つまり、GStreamer を使うことで、動画や音声などを取り扱う多様なソフトウェアを、比較的少ない労力で実現できるということです。
GStreamer の名前は “G” と “Streamer” の 2 つのパーツから成り立っています。 “G” が何の G なのかは公式サイトには書かれていないようですが、GNU プロジェクト から来ているのだと思われます(Fig. 1)3。
また、“Streamer” は、このソフトウェアがストリームとして流れるデータの処理を強く意識して設計されていることを示しています。 このために GStreamer では、効率的なメモリ管理や、映像と音声などの異なる経路で流れるメディアデータを同期するための時刻の管理など、様々な仕組みを備えています。これらの詳細な仕組みについては以降の連載で述べていきます。
GStreamer のアーキテクチャ
GStreamer を利用するためには、まず エレメント および パイプライン という基本概念を知る必要があります。
エレメント は、メディア処理の特定の機能を実装したプログラムです。 特定の機能とはたとえば、次のような処理のことです。
- ビデオフレームをリサイズ (
videoscale
) - ビデオのピクセルフォーマットを変換 (
videoconvert
) - テスト用のビデオデータを出力 (
videotestsrc
) - 画面にビデオを表示 (
autovideosink
) - ビデオを x264 を利用してエンコードし、H.264 エレメンタリストリームとして出力 (
x264enc
) - MPEG-2 TS でストリームを多重化 (
mpegtsmux
) - MPEG-2 TS からストリームを取り出し (
tsdemux
) - ファイルを読んできてデータを出力 (
filesrc
,fdsrc
) - データを受け取ってファイルに書き込む (
filesink
,fdsink
)
いずれも、メディアデータを出力したり、他のエレメントから受け取ったりする処理です。
パイプライン は、エレメントを相互に接続してデータをやり取りするための仕組みです。 パイプラインオブジェクトは利用する各エレメントのインスタンスとそれぞれの接続グラフおよび、現在の再生状態を持っています (Fig.2)。
UNIX に慣れた方なら、複数のプログラムをパイプで接続して複雑な処理を行うイメージは持っていただけるでしょう。
IBEX 社内の GStreamer 活用事例
アイベックステクノロジーでは、主に FPGA に実装した動画コーデックを利用した製品を開発しています。 そのため、自社の FPGA 向け IP をアプリケーションに組み込むための API として、一部で GStreamer を利用しています。
また、CRO 技術部では、AI 画像認識や暗号化などのアプリケーションの実装に、GStreamer を利用しています。
製品に直接組み込まれる以外にも、コーデック IP などの開発中のデバッグに GStreamer エレメントを使うこともあります。
GStreamer はとにかく汎用性が高いため、社内でも様々な目的に利用されています。
とりあえず動かしてみる
GStreamer の提供するすべての機能にアクセスするためには、C 言語などでプログラムを記述する必要があります。
ですが、既存のエレメントを利用して単純なパイプラインにデータを流すだけなら、gst-launch-1.0
コマンドラインツールを利用してお手軽に行うことができます。
ちょっとしたメディアデータの確認や変換作業なら、これだけでも十分できてしまいます。
GStreamer は主要な Linux ディストリビューションでは標準で提供されているほか、BSD、Windows、macOS、Android、iOS など、あらゆるプラットフォームで利用可能です(公式サイトのダウンロードページ、インストールガイド)。 Linux の場合、通常はディストリビューションのパッケージマネージャーからインストールします(ガイド)。
# Ubuntu の場合
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio
# RHEL 系の場合
sudo dnf install gstreamer1-devel gstreamer1-plugins-base-tools gstreamer1-doc gstreamer1-plugins-base-devel gstreamer1-plugins-good gstreamer1-plugins-good-extras gstreamer1-plugins-ugly gstreamer1-plugins-bad-free gstreamer1-plugins-bad-free-devel gstreamer1-plugins-bad-free-extras
# Gentoo の場合
sudo emerge media-libs/gstreamer media-plugins/gst-plugins-meta
ここでは Linux にインストールした場合を想定しますが、基本的には他の OS でも同様の使い方ができます。
というわけで、さっそく動かしてみましょう! GUI が使える端末で、次のコマンドを実行します。
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
セットアップに問題がなければ、こんなカラーバーの動画が再生されるはずです。
上のコマンドラインは、videotestsrc
エレメントが出力した生ビデオ (video/x-raw
) データを、videoconvert
エレメントが後段の autovideosink
エレメントに合わせて適切なフォーマットに変換し、最後に autovideosink
エレメントが画面に出力するというパイプラインを構築し、再生するという処理を実行しています。
UNIX では |
を使ってコマンドどうしをパイプで接続しますが、gst-launch-1.0
のコマンドラインで使えるパイプラインの記法では、!
を使って接続します。
videotestsrc
は、プロパティを変更すれば、カラーバー以外にも色々なビデオを生成できます。試してみましょう。
gst-launch-1.0 videotestsrc pattern=snow ! videoconvert ! autovideosink
gst-launch-1.0 videotestsrc pattern=ball flip=true ! videoconvert ! autovideosink
エレメントにどんなプロパティがあるかは、gst-inspect-1.0
コマンドで確認できます。
gst-inspect-1.0 videotestsrc
vertigotv
エレメントを使えば、ビデオをぐにゃぐにゃに変形させることもできます。
gst-launch-1.0 videotestsrc ! videoconvert ! vertigotv ! videoconvert ! autovideosink
videotestsrc
に違う解像度を設定したければ、Caps filter というものが使えます。
gst-launch-1.0 videotestsrc ! video/x-raw,width=1920,height=1080 ! videoconvert ! vertigotv ! videoconvert ! autovideosink
もちろん、ビデオだけではなく、オーディオも扱えます。
gst-launch-1.0 audiotestsrc ! audioconvert ! audioresample ! autoaudiosink
gst-launch-1.0 audiotestsrc wave=pink-noise ! audioconvert ! audioresample ! autoaudiosink
オーディオをヴィジュアライズすることもできます。
gst-launch-1.0 audiotestsrc freq=20 ! audioconvert ! wavescope ! autovideosink
gst-launch-1.0 audiotestsrc wave=pink-noise ! audioconvert ! synaescope ! autovideosink
同じオーディオを再生しつつヴィジュアライズも行いたいなら、tee
エレメントを使って分岐して、queue
エレメントでスレッドを分けます。
gst-launch-1.0 audiotestsrc wave=pink-noise ! tee name=t ! queue ! audioconvert ! audioresample ! autoaudiosink t. ! queue ! audioconvert ! synaescope ! autovideosink
同様に、動画や音声のコーデックやマルチプレクサ、ネットワークやファイルへの出力エレメント等を組み合わせれば、動画プレイヤーやストリーミングサーバー、コーデック変換などの多様な処理が自由自在に実現できます。 とっても便利だと思いませんか!!
おわりに・今後の連載予定
今回は、GStreamer とは一体どういったものなのかご説明しました。
今後の連載では、GStreamer アプリケーションやエレメントを実装するための方法や、GStreamer が提供する抽象概念など、より詳細な解説を行う予定です。
それでは、また次回お会いしましょう。
Footnotes
-
The hero image is adapted from GStreamer logo in SVG format by Christophe Dumas, used under LGPL. This image is licensed under CC BY-SA 4.0 by Fuga Kato.
To comply with LGPL, the diagrams.net project file is available here. ↩ -
GStreamer 本体は LGPL でライセンスされていますが、GStreamer から利用できるライブラリ(エレメント)や GStreamer を利用したアプリケーションの中には、他のライセンスで提供されるものも多くあります。たとえば x264enc などのエレメントは GPL でライセンスされていますし、プロプライエタリなエレメントやアプリケーションも許容されます。 ↩
-
This work, “Bloodline of G”, is adapted from following works. “Bloodline of G” is licensed under CC BY-SA 4.0 by Fuga Kato.
“A Bold GNU Head” by Aurélio A. Heckert, used under CC BY-SA 2.0.
SVG version of Wilber, the GIMP mascot by Jakub Steiner, used under CC BY-SA 3.0.
The GTK logo by Andreas Nilsson, used under CC BY-SA 3.0.
GStreamer logo in SVG format by Christophe Dumas, used under LGPL.
To comply with LGPL, the diagrams.net project file is available here. ↩