はじめに
この記事は自分の甘さを戒めると共に、他の人にgst-launch
を使う際の覚悟を問うものである。
私が行いたかったことは、Jetson Nano
という小型のコンピュータに取り付けたUSBカメラの映像を、ネットワーク越しからただ閲覧したかっただけである。それだけの事なのに、大変なことになったので書き留めることにした。
gst-launchの真実
カメラや動画ファイルを処理したい場合GStreamer
を使うことができる。GStreamerはライブラリ群とツール群がら構成され、その中の一つであるgst-launch-1.0
というコマンドを使えば様々な処理をプログラミングなしで行うことが可能である。
「プログラミングなしで」という言葉につられてgst-launch-1.0
を使ってみた人は多いのではないだろうか。gst-launch-1.0
では引数に様々な処理を連結させることによりパイプラインを実現している。
このパイプラインが複雑で「とりあえず簡単に使ってみたい層」の期待を大きく裏切っているように思う。gst-launch-1.0
のパイプラインを使って思ったことは「素人には難しい」の一言に尽きる。よくよく考えれば当たり前のことで、簡単に扱えると思った自分が甘すぎたことを反省するばかりである。
コピペは動かない!
GStreamerほどの歴史があると、インターネットの検索で沢山のサンプルに出会うことができる。正常に動くものもあれば、そうでないものもある。正常に動かない理由は下記のようなものである。
- カメラやマイクのデバイス指定をする部分が異なる
- カメラ独自のエンコーディング機能に頼った部分が含まれている
- 古いプラグインが存在しない
- ある機器固有のプラグインを使っている
- そもそも間違っている(typoとか)
時と場所が変わればパイプラインも変わるのだということを認識せざるを得ない。逆に言えば
「動くコピペ以外に手を出すな!」
と言いたい。あなたがやりたい事は、あなたが思っている以上に奥深く、そして面倒な事の可能性の方が大きい。
映像・音声の知識は必須!
まず「gst-launchを使えばプログラミングなしで様々な処理ができる」のは真実である。しかし「様々な処理に必要な知識が不要」という訳ではない。
- 入力となるカメラや動画ファイルについての知識が必要である
- 出力となる動画ファイルやネットワークプロトコルについての知識が必要である
- パイプラインの各要素の組み合わせを調べて正しく接続する必要がある
例えばカメラの場合、どんな形式で映像を出力するのか(YUYV or H264 or MPEG?)、ファイルの場合は映像のコーデックは何で音声のコーデックは何を使っているのか。ネットワークに出力する場合、IPアドレスやプロトコルなどの知識が必要である。
映像の専門家や365日毎日エンコーディングをする「とにかく画質にうるさいツワモノ」でもない限り、こんな知識は普通持ち合わせていない。そんなツワモノであっても一箇所間違えるだけで動かないのである。
パイプラインも難しい!
上記だけでも大変なのだが、GStreamerのパイプラインの知識が必要である。
- パイプラインの構成要素(ElementやLinkなど)
- 用語(src, sink, pad, etc.)
さらに「パイプラインの記法」が難しい。gst-launch-1.0のパイプラインの記法に関する公式マニュアルをざっと読んでみたがとても難しい。主な要因は次の3つ。
そして恐ろしいのが
- パイプラインの一箇所でも間違えるとうまく動かない
という点である。パイプラインだから当たり前と言えば当たり前だが、問題点が二箇所以上に渡ると原因究明が途端に難しくなる。gst-launch-1.0
を使えば楽に処理できると考えていたのに、楽をするために死ぬほど勉強するハメになる。
まとめ
gst-launch
は決して動画処理の特効薬ではない。心してかかれ!