GStreamer 座談会

株式会社クリアコードの須藤功平(すとう・こうへい)さんを発表者にお迎えし、GStreamer の概要を紹介していただきました。当日の発表の様子と資料は、須藤さんのブログでご覧いただけます。須藤さん、どうもありがとうございました。

(2010年1月7日開催)

須藤功平さんの自己紹介

かわの第6回はGStreamerということで、クリアコードの須藤さんお願いします。

すとうまず最初に自己紹介をしてから本題に入ろうと思います。私はオープンソースを開発するコードを書くことをずっとやっていて、数えてみると7年くらいやっています。その間に、自分で作ったソフトウェアをオープンソースで公開することがほとんどなんですけども、それ以外にも他の人が作ったものにもバグを見つけたら直したりとか、こういう機能があったらいいんじゃないかといったときにまた投げたりとか、というのをやってきていて、いくつか自分がメインでないものにもプロジェクトにコミッターという形で参加していて、Rubyというプログラム言語のコミッターになっていたり、Subversionのシステムコミッターもやっています。あとは、今日はGStreamerについて話すんですけど、それの関連でRuby-GNOME2、GNOMEというデスクトップ環境をRubyから使うためのバインディングのメンテナンスをやっていて、そのうちの1つにGStreamerをRubyから使うというものがあります。

今使っているプレゼンソフトも自分で作ったものなんですけども、これでGStreamer、GStreamerはマルチメディアのフレームワークなんですけども、音を出したりしたいとか、ビデオを出したりしたいなぁと思って手をつけ始めたのが最初です。今はまだGStreamerの機能を組み込むところまでは行っていないんですが、そんな感じで始まっています。なので、実際に今、全部の機能を知っているというわけではなく、自分が興味のあるところだけ知っているという感じなので、今日も概要なんで全部網羅するわけではなくて、こことこことここだけみたいな感じで紹介します。

一応、会社をやっているんですけども、自分と同じような人たち、開発者ばかりのメンバーとやっています。オープンソースのソフトウェアを使った開発をしているんですけども、開発に参加することで得た知識とかを仕事に生かして、というのはあります。例えば、パッチとかを投げるときは、相手の人にどうやったら受け入れてもらえるかというのを考えながら投げたりするので、そういうことなども、普通のオープンソースではない開発にも生かせるので、そのような形で会社をやっています。現在6人ですね。あと、趣味の方だと鯛焼きが好きで、taiyaki.ruというドメインを取って、サイトを最近リニューアルしました。そういうのをRubyで作ったりしています:-)

GStreamerって何?

すとうで、本題なんですけども、GStreamerというのはマルチメディアのフレームワークです。どういうことができるのかというのを今日はざっと知ってもらえたらいいのかなと、翻訳するときとかにも参考になるのかなということで話したいと思います。

まず、できることなんですけども、マルチメディアを再生することもできますし、フォーマット変換することもできます。デバイスからビデオなどを撮って録画してファイルに保存するとか他に飛ばすとかみたいなこともできます。ネットワークの通信にRTPやDSPもサポートしています。他にもいろいろできるんですが、以上がざっと紹介したいものです。

GStreamerのデモ

すとう最初にデモしてみた方がわかりやすいかなと思いますので、やってみたいと思います。

再生なんですけども、GStreamerはgstと略されることが多いんですけども、その機能を使うコマンドにgst-launchというのがあって、例えばこれでsample.ogaっていうのがあるんですけども、こんな感じで音が出る、というのができたりします。音だけではなく、さっきのところをvideoに変えてやると音も動画も再生できます。

変換もできて、今、Ogg Vorbisの音声のファイルがあったんですけども、それをAACに変えるということもできます。さっきよりコマンドが長いんですけども、まずファイルから読み込みます。で、ビックリマークでいろんな要素をつなげていけるんですけども、まず読み込んで(コマンドの入力)、で、マルチプレクサーですね、で、ここはコンテナなんでそこから音声のところを抜き出して、Vorbisでデコードして、オーディオコンバータ(audioconvert)というのは音声のファイル、今これデコードすると生のフォーマットになっているんですけども、それを微妙に変えたりすることもできます。で、これをfaac、フリーのAACの変換のやつですね、でAACのエンコードにして、マルチプレクサでMP4に入れてやって、ファイルシンク(filesync)でファイルに書き出す、とやるとこんな感じで変換がおこなわれる。

で、今まだ途中なんですけどもMPEG4になって、元のはOgg-Vorbisってなっているやつなんですけども、変換するとこんな感じになるということです。で、変換もできて、録画もできて、今これWebカメラを付けているんですけども、ここからVideo for Linuxで取ってきて、そのまま表示できたりします。今はディスプレイに出していますけども、ファイルに出すってやると録画というか保存になります。さっきのやつが終わったので再生してみると、AACにちゃんとなっていて、MPEG4になっていて、FAACの多分ライブラリの名前だと思うんですけども、という風になっている。

で、さっきのビデオなんですけども、それにテキストを乗せることもできます。さっきと同じようにVideo for Linuxを持ってきて、テキストオーバーレイ(textoverlay)というのがあるんですけども、これでテキストを変えて、もうちょっとフォントは大きめにして、出力すると下のところにテキストを出したりできます。こういう風にしていろいろくっつけていけます。さっきのに更に、今はビデオだけだったんですけども、音声も一緒に付けることもできます。(コマンドの入力)。あとは、ネットワーク経由で今のを転送することもできます。(コマンドの入力)。

今は動画を飛ばした設定で進んでいますけど、普通にファイルの転送もできます。受け取る側でTCPから何か飛んできたのをファイルに出すみたいに書いておいて、送る側でファイルから読んでTCPで送ってやるように書くと、このようにファイルができて、今これスライドの元ネタのテキストなんですけども、同じようなファイルができています。普通はnet catとかやるともっと楽にできるのでこんな風には使わないんですけども、何も変換しないで送ると同じものが届くというような感じで使えます。このような感じで、大体イメージが掴めたかなと思うんですが、いかがでしょうか。

誰が使っているか

すとうで、GStreamerは誰が使っているかというと、GNOMEの環境だとみんなGStreamerを使っています。メディアプレーヤーでも使っていますし、音楽プレイヤーでも使っていますし、CDからリッピングしてファイルに落とすというやつでも、入力がCDからというように指定してコンバートしてファイルに落とすというだけなので、同じようにできます。あとはVoIPとかビデオ会議のソフトもGStreamerを使って動画を転送したりしています。GNOME以外ではSongbirdという、Mozillaとかと同じテクノロジーをXUL(ズール)って言うんですけども、その上に作られた音楽プレイヤーとかGnashというFlashのプレイヤーとか、動画編集のソフトもGStreamerを使って実現されています。FLVもGStreamerで再生できます。

似ているソフトウェアなんですけども、FFmpegというのをよく聞くと思いますけども、他にQtの方のPhononとか、Macで言えばQuickTimeとかQTKitのあたりに対応したり、WindowsだとDirectShowあたりが同じようなソフトウェアになります。

関係を図にするとこんな感じだと私は勝手に考えているんですけども、一番上のがPhonon。Qtのやつですね。これはAPIだけを提供していて、実際の変換するとかいうのはバックエンドの方に投げています。バックエンドでは何が使えるかというと、MacだとQuickTimeが使えて、WindowsだとDirectShowが使えて、UNIX系のところだとGStreamerを使うという実装になっているみたいです。GStreamerとかQuickTimeとかDirectShowは実際のコーデックを変換するところも持っていますし、実際にプログラムから使うAPIも持っているんで、ここだけでも使えるそうです。

GStreamerが上の方に書いてあるんですけども、GStreamerからQuickTimeの機能を使ってQuickTimeだけが持っているコードを使ったりとか、DirectShowに処理を渡すみたいなこともできます。FFmpegは下の方でコーデックとかを提供しているので下の方に書いています。GStreamerからFFmpegの機能を使って、さっきもMPEG4のコンテナを作るときに使っていましたけども、そんなことができたりします。

特徴なんですけども、今回紹介したのはオープンソースソフトウェアだからということで、LGPMのバージョン2 or laterになっています。で、マルチプラットフォーム対応でVectorを使うとかDirectShowを使うとか使うということは、Macで動かしているときはQuickTimeのバックエンドが使えるし、あとはLinuxでもSolarisでもP3でも動くらしいです。Solarisで試したことはないですけど、あとは普通にIntelのマシンでもPPCでもARMでもSPARCでも、っていう風なことが書いてあります。

特徴的と言えば特徴的であるのあるかもしれないですけど、プラグインのシステムを使って、さっきビックリマークを何個も追加していったと思うんですけども、それの1個1個のところを共有ライブラリで動的に読み込んで、新しい要素を追加できるようになります。プラグインのところはGPLやLGPではなくても、独自のライセンスにすることもできたりします。ここからは中身がどういう風になっているかをざっくり説明します。

GStreamerの仕組み

すとうさっきビックリマークでぽんぽんつなげていったものの1個の、ビックリマークとビックリマークの横側にあるところがエレメントというものになるんですけども、これをぽんぽんぽんぽんとくっつけて1個の処理をします。エレメントにはパッドというものが付いていて、ここが他のエレメントとの窓口になります。こことこことこれをくっつけるときはパッドとパッドがくっつくことになります。パッドとパッドがくっつくとリンクと言ったりします。このエレメントをパッド同士でどんどんくっつけていって、それを1個にまとめたものをパイプラインというものにポンと入れて、パイプラインをスタートとかストップとかすると、中のデータのストリームが動き出すという流れになっています。パッドには2種類あって、今これはファイルソースという要素の名前になっているんですけども、これはデータを生成するパッドがソースパッド、データの入力になるところがシンクパッド、シンクパッドって字は違うんですけど、になっています。というのが全体の流れです。

エレメントは、さっき言ったソースだけしか持っていないパッドがあって、それはソースエレメントと呼ばれているんですけども、データを生成するものです。

2つ付いているシンクとソースの付いているやつは、データを入力して何かをしたりしなかったりしてソースに出す、フィルタという分類になると思うんですけども、デコードするやつとかエンコードするやつはシンクが1つでソースが2つのときはdemultiplexerとかコンテナのファイルから動画と音声を抜き出すとかいうやつはソースが2つになったりします。逆にシンクが2つあってソースを1つにするコンテナを作るようなやつは、こんな感じでシンクが2つになったりします。というようなのがフィルタです。

シンクエレメントというのは、データを受信するだけでそこが一番最後のゴールになるところですね。ファイルに落とすときも、データを受信して中で勝手にデータ処理して次の要素(エレメント)には渡さない。

リンクはエレメントをリンクさせていって、最終的に1個のアプリケーションにするんですけども、それをドンというのが、さっきパイプラインって言ったんですけども、パイプラインも一種のbinというやつなんですけども、エレメントをたくさん入れられるエレメント、コンテナエレメントみたいな感じだと思ってもらえれば。パイプラインというのは特別なbinです。

デモの一番最初にplay binというのを使ったんですけども、それは何もかもが全部入ったbin、便利binで、ファイルやURLを入れてやると読み込んで中のフォーマットを推測して、勝手に出力先を上手い具合に選んで出してくれるというbinです。binもエレメントとして使うことができます。

Ogg Volbisのプレーヤーを作るとしたら、ファイルから読んでoggをdemultiplexerにかけて、Volbisのデコードをして、ちょっと調整して、音声の出力、スピーカーとかに出してやる、という風な流れになります。

それぞれのパッドにMIMEタイプが付いていまして、こことここをくっつけるときとかは、両方で上手い具合にマッチするMIMEタイプじゃないとくっつけられません。ファイルのソースだと出力は何でもOK、読み込んだのを出すだけなので別に気にしないで何でもOKとなって、demultiplexer要素はoggのフォーマットしか受け付けません、という風になります。で、そういうのをくっつけていって、Volbisを取ってきて、Volbisを取ってきたらデコーダにかけられると。かけられたら、今フロートの生データになっているという風になっていますけども、それをfloatからintに変えてやってスピーカーから出せるみたいな風に変えていって処理が流れていく。データとデータの種類、メタデータがくっついて動いているという感じです。

プレーヤーにするときは、さっきはこの上を回るだけだったんですけども、下のビデオの方もこうやってくっつけてやるとプレーヤーになるということです。ということで、ざっくりとGStreamerの紹介をしました。

ここまでのまとめ

すとうGStreamerというのはマルチメディアのフレームワークで、再生とか変換とか録音とか、いろんなことができます。利用者はGNOMEアプリケーション全部、全部というか、マルチメディアを使わないやつは使っていないですけども、まぁ全般で使われていて、他でも使われています。SongBirdとかはマルチプラットフォームで動く音楽プレーヤーなんですけども、そういうところでも使われたり、また組み込みのところでも、最近だとモグリンとかでも使われていたりします。似たようなのにフォノンとかQuickTimeとかもあったりします。

主要な要素はエレメントとパッドとbinで、エレメントはデータを処理する範囲で、ソースとフィルターとシンクというのがあります。で、エレメントの外側にはパッドというのが付いていて、そこが他のエレメントとのやり取りの口になります。エレメントとエレメントをパッドを経由してくっつけるとリンクするという風にいって、エレメントをいっぱいポンと入れたのがbinという名前で、binもエレメントになります。

今日省略したのはdecodebinという便利binがあったり、あとはキューとかスレッドとか、gst-inspectというのがすごい便利なやつなんですけど、プログラムからどういう風に使うんだという話とかは省略しました。以上です。

同期のしくみはどうなってるの?

かわの直接GStreamerと関係ないと思うんですけど、multiplexerでコンテナの中にサウンドとビデオを入れたときって、サウンドとビデオの同期はどういう仕組みになっているんですか?

すとうクロックっていうのがあって…

かわのコンテナの中にあるんですか?

すとうコンテナの中にというか、コンテナと独立してクロックっていうのがあって、それを使って複数のエレメントからの入力を同期させたりずらしたりみたいなことができるはずです。クロックを使って上手い具合にタイミングを合わせたりっていうことをするはずです。

しおや例えば、高速にデータフォーマットを変換するというときは同期なんか気にしないでCPUのある限り回して...そうじゃなくて、さっきみたいに1つのファイルから音声と画像をスピーカーとモニタに出力するというときにはクロックに同期しながら実行というイメージで考えればいいんですかね?

すとうはい、そうですね。キューというのを重ねてたのが、その同期させるみたいなところになったりするんですよ。

しおやそのへんに秘密があるんですね。

GStreamerのライバルは?

ともじオープンソースのフレームワークで、GStreamerに類似するものあるいは匹敵するものっていうのはあるんですかね?

すとうxine(クシーン)というマルチメディアプレーヤーがあるんですけども、それがライブラリにもなってて同じように使えたり、VLCプレーヤーというWindowsでも使えるやつもライブラリで使ったりするので。あと省略したんですけど、PhononっていうQtのやつだとそれもバックエンドで使えたりするので、似たような層のところにあるのかなぁと。

ともじ開発をVLCの人たちとGStreamerの人たちと裏で交流したり競争してたりするんですかね?

すとうGStreamerからVLCの要素を使ったりはしますね。GStreamerはいろんな要素を間に入れていけるという仕組みになっているストリーム=流れになっているので、他の使えるものを間にポンと入れてっていう風な使い方を仲良くやっているそうです。

しおやGStreamerのコアとしては、時間に沿って流れていくデータをパイプのような形でつなげたり分けたりするというところがGStreamerのコアで、じゃぁ、具体的に流れるデータはどうするの?っていうのはエンコードのコンポーネントを作る人たちだったり、FFmpegのコンポーネントを使ったり、他のWindowsのDirectShowとかQuickTimeから借りてきたりするわけですね。

すとう流れを作るための枠組みをフレームワークとして提供しているというのがいいなと思います。

コーデックがたくさんあるのはなぜ?

かわの動画とか音声ってなんでこんなにたくさんコーデックがあるんですか?使っていていつもこんがらかるというか、使いにくいんですけど。

しおややっぱりデジタルデータはもともと0と1しかないから、いろいろと表現の手段とか方法が考えられるというか何というか…。

ともじある種アメリカ的というか、みんなが好き勝手にいろんなものやって、最後にデファクトが生き残るという。日本とかフランスあたりが政府主導でやるとコーデックは一個なんだけれども、二十年前の古いコーデックが使われるとかいうことじゃないですかね、想像ですけど。

すとういろいろ特徴があったり、エンコードするのが遅いとか、低いビットでそれっぽく見えるようにするとかいうのがあるんで、例えばマシンスペックのそういうところでやるやつはデコードが軽いやつがいいとか、でも、多少画像は落ちてもいいよとか、ネットワーク転送するんだったらとか、そういうのでいろんなコーデックが出ているんじゃないかなと。

かわのコーデックの開発はそんなに大変なことではないんですか?

すとう大変だと思いますよ。

いぬいコーデックは数学がわかる人じゃないと開発できないはずですね。

ともじ動画とか、圧縮するというところがアルゴリズムですね。仮に圧縮しなかったらすごくシンプル?

いぬいそれはめちゃめちゃシンプルですね。

ともじ仮に圧縮しないと、例えば2時間の映画をDVDにしたらどのくらいになるんですかね?

いぬいそれは1280×1024、1秒間30フレームで…って計算したらわかるんじゃないですか?

ともじあぁ、なるほど。それを圧縮して、かつ画質を落とさずに、かつスムーズにデコードできて再生できるっていうことをやろうとすると高度なアルゴリズムが必要になるっていうことですね。

かわの確かにすごく小さくなるよね。MP3の場合はMOAでしたっけ? なんかにエンコードするとかなり小さくなるので、この前びっくりした。

いぬいビットレートとかも指定できますしね。MPEG4とかは周波数帯をカットとかするので、何Hz以上はいらんとかいうのもあります。だから、そういうのに適したような、MP3だとそういう圧縮コードをしますし。

かわのコーデックってどんどん進化している領域のような、新しいものが出てくるという印象があるんですけど。

いぬいまぁ、出てきてはいますけど、そんなに激しいですかね。そんなに激しくないような気はするんですけど。さっきの話と同じで、ケースバイケースで、例えばマシンパワーがあってもいいところはH.323で圧縮しましょうとか、その代わり低ビットレートでかなりきれいな絵が見られますとか、そんなのもあるしそうじゃない場合もあるし、そうすると今度はリアルタイムエンコードに適しているものとか適していないものとか、いろいろあるんですけど、リアルタイムにやろうとすると遅延するとまずいので、あんまりガンガン圧縮かけれられないとか、そのとき何を選ぶかとか。まぁ、そういうのがいっぱいあるというのは、ウーロン茶がいっぱいあるようなもんですね。

かわの多用な要求があるからそれに応えるためにそれぞれ…

いぬい好き勝手に作っているのも。日本のもありますし、商用版とかオープンソースもありますけど、商用版は商用版でまたいっぱいありますしね。

ともじ中国でだけ普及しているコーデックもありますよね。

ネットワークを経由する場合

みや マシンをネットワークを介していという話がありましたけど、そのときのプロトコルは専用のものを使うんですか、それとも…

すとうそれは専用のものを使います。さっきのやつだと生で直接データを取っていましたけど。

みや それはフレームワークが持っているプロトコルなんですか?

すとう標準であるやつを使いますね、普通は。簡単なやつもあるんですけど、普通はそういうのは使わないでRTPとかいうのを使ったり。

しおやGStreamer側から見るとネットワークを越していようが何だろうが、1つのエレメントしかないわけですね。

GStreamerで実現される新しいユーザー価値は?

みや 漠然とした質問なんですけど、YouTube的なサービスをもっとおもしろくとか効率よくとかっていうのをできる可能性ってあるんですか? 同様にSkypeとかも、このツールを使うと何かできるのか?まったく違うものなのかというのがよくわからないんですけども。

すとう例えばフォーマット変換したり、ユーザからアップロードされるフォーマットを増やしたりとかっていうのをしやすくなります。AVIでアップロードできなくて、中でFlashとかFLVとかに変えていると思うんですけども、間の入力をデコードする部分だけを変えてやれば、AVIにも対応できるしOggで来てもOKだしみたいな風なこともできるので、新しいファイルが来ても対応しやすくなるというのはあるかもしれません。

みや 普通はYouTubeとかでFlashを選択してるじゃないですか、ユーザエンドでは。あれをこれで置き換えられる可能性というか、まぁ、YouTubeがいいかどうかは別として、これを使ったらもっと効率がいいとかおもしろいとか、ユーザから見て…。

すとう効率がいいとかっていうのを考えるんだったら専用プレーヤーっていうのを作りやすくなると思います。フォーマット変換するところだけを変えてやればいいようにサーバもなるんで、クライアント側もそれ専用のものを提供しやすくなる。そうすると、今度はユーザ側にブラウザだけあれば動きますではなくて、専用のやつを入れてくださいという風になるので、効率は落ちちゃうかもしれませんけど。

みや ブラウザはプラグインとして動くのか、そうすればサーバ側のコーデック変換の負荷が下がるとかそういうことができるんですかね?

すとうということもできますね。上手いコーデックを選べば、ということですけど。転送に適したコーデックとかいろいろあるので、それを選んで、それがFlash、FLVで流すよりも性能がよくなるという風に確かめられるんだったら、そういうのもありなのかなと。

しおやうれしいかどうかはわからないけど、例えばSkypeでチャットしながら同時にYouTubeのストリームがすぐそばに並んでいるみたいな、SkypeでしゃべりながらYouTubeを一緒に楽しむアプリケーションみたいなのは書きやすくなりますよね、専用のクライアントなら。

みや この動画のここがおもしろいんだって同時に笑えたりとか、早送りをしながら…。

いぬいうちで作ってますよ(笑)。映像で多人数で会議しながら映像資料をみんなで見るっていう。で、その映像資料は早送りしたり巻き戻したりとか、ひとりが巻き戻すとみんな巻き戻るんですよ。

ながえ野球の試合とか?

いぬい今やっているのはファイルからローディングしたもので、誰かがそういうファイルを持っていたらそれをみんなで。最近はプレゼンとかで映像資料を使うケースが多くて、それをみんなに見せると。そして、指摘があったら巻き戻して「ここか」みたいな。

ともじ裏方ではGStreamerのようなものが動いているんですか?

いぬいそれは独自です。そういうところにGStreamerを使うともっと楽になるんでしょうね、きっと。ただ、同期を取らないといけないので、その辺りが難しいかもしれないですね。

すとうそれもあるんですよ。再生するときシンクするっていうのが。

いぬいネットワークでいくつかGStreamerとのインスタンスがタッチ点にいくつかあるときに、それぞれに置くとシンクされるようなものがあるといいんですか?

すとうシンクするというAPIがあるので、エレメントのところをがんばってシンクのAPIに対応すれば、普通のローカルでやったのと同じ使い方で対応できると。ネットワークも独自だと思うので、そこのところをシンクに対応して作れば、そういうこともできるようになる。

しおやGStreamerでエレメントとエレメントをつないでbinを作るとして、そのbinの構成っていうのはダイナミックに変更できたりするんですか?

すとうできます。ファイルを読んでみるまではどのMIMEタイプかわからないというようなときは、ダミーのゴーストパッドを入れておいて、わかった時点でパッドを切り替えるみたいなことをします。

GStreamerのビジネス利用

いぬいビジネス的に使っているケースはあるんですか?

すとうあります。海外ですけど、これを使って製品を出したり。

いぬいそれはLinux上の製品ですか?

すとうそうですね。

ながえ例えばどんな製品ですか?

すとう開発者自体を雇ってやっているので、今Webがないのでググれないんですけど、GStreamerを開発した会社がやっているというのを見れば、どういう製品を出しているかとかっていうのはわかります。

しおやどうしてもデスクトップ環境を連想しちゃうんですけれど、もちろんサーバで使っても問題はないんですよね?

すとうはい。(このあとWikipediaのGStreamerのページでビジネス利用例を検索)

ながえあぁ、DVDプレーヤーを組み込みLinuxでやってる。

須藤さんとGStreamerの関係

かわの須藤さんはGStreamerをどういうことに使っていこうと考えていたんですか?

すとう元々はプレゼンのソフトに使いたかったんですけど、ビデオ埋め込みとか、音声埋め込みとかに使いたかったんですけど…。

かわの過去形ですか。

すとうまだ実現されていないので(笑)。このソフトがRubyで書かれているので、Rubyから使えるようにするところも作らないといけない。で、そこから始めて、いろいろ時間がかかるわけなんですけど、そういうことをやっているうちに違うプロジェクトを立ち上げるとか…。

かわのではまだGStreamerで、お金を儲けてはいない?

すとうお金は…GStreamerを使った仕事とかは何回か、私が担当していないのとかでもあったりするんですが...

(以上、インフォサイエンスにて)