GStreamer をつかって画像の加工やら音の加工やらができそう。FPGA や GPU ともつながってきそうなのでelement が作れるくらいにはしたい。
まずは使ってみる
Ubuntu なら apt install をつかえばすぐにインストールできます。
Ubuntu 20.04 では 1.16.2 が, Ubuntu 18.04 では 1.14.5 がインストールされるようです。gst-insepect-1.0 こまんどでバージョンを確かめてみましょう。
> gst-inspect-1.0 --version gst-inspect-1.0 version 1.14.5 GStreamer 1.14.5 https://launchpad.net/distros/ubuntu/+source/gstreamer1.0
base のプラグインだけではなんとも融通が利かなかったので、その後gstreamer1.0-plugins-good(good なやつ)gstreamer1.0-plugins-ugly(みにくいなやつ)gstreamer1.0-plugins-bad(bad なやつ)もいれています。たぶん x264 を使うためにその関係のライブラリもいれたと思います。いれるオブジェクトが多すぎて追跡できてません。
さて、実行環境は整ったとしましょう(じつはここまでが一番大変だったりするがめげずにがんばりましょう)。今回の環境では gstreamer をUbuntu サーバに入れたためまったく GUI を持っていません。そこで、外部の VLC プレイヤーをつかって動作確認をします。
カメラから mp4 ファイルへ落とす
USB カメラを Ubuntu につないで、/dev/video0 とか /dev/video1 のパーミッションを適切に設定した後、次のコードを実行することで mp4 のファイルを生成することが出来ます。
#!/bin/sh if [ $# -eq 0 ]; then echo Usage $0 file num-buffers fi OUT_MP4_FILE=${1:-"cam-movie$$.mp4"} NUM_BUFFERS=${2:-500} echo $OUT_MP4_FILE $NUM_BUFFERS gst-launch-1.0 v4l2src num-buffers="${NUM_BUFFERS}" ! textoverlay text="Cam, Sinby Corp." font-desc="Sans 36" ! queue ! x264enc ! mp4mux ! filesink location=${OUT_MP4_FILE}
最初、timeout コマンドや Ctrl-C を使って止めていたのですが、それは途中でやめました。
mp4 を rtp で転送
filesrc の location 設定で生成した mp4 を指定して、rtph264pay で rtp のヘッダ付けてます。RTP の pt は 96 としています。
gst-launch-1.0 filesrc location="$1" ! decodebin ! x264enc ! rtph264pay config-interval=10 pt=96 ! udpsink host=224.1.1.1 port=5000
RTP では pt の 96 より若い番号は用途が決まっています。96 以降が自由に使える番号なのでビデオなりオーディオなりテキストなりをおくればよいことになります。この例ではビデオが 96 です。
VLC で rtp を視聴
VLC でマルチキャストアドレス 224.1.1.1 の 5000 にジョインすればはいうまく視聴できます、、、、といいたいところですが、RTP の場合そうはうまくいきません。pt の番号がなんであるかをVLC に教えてあげないとちゃんと視聴できないのです。そのための sdp という記述を予め用意してやり、VLC で読むことで視聴が出来るようになります。
v=0 m=video 5000 RTP/AVP 96 c=IN IP4 224.1.1.1 a=rtpmap:96 H264/90000 m=audio 5000 RTP/AVP 97 c=IN IP4 224.1.1.1 a=rtpmap:97 VORBIS/44100/2
97 にオーディオをアサインしていていますが、使ってません。ですので、正確には視聴でなく見るだけです。あいすいません。
GObject をつかうと
GObject をつかうともっとすごいことができます。Python と連携できます。現在実験中でございます。
後日 gstreamer をコンパイルしてみた
後日、gstreamer をコンパイルしてみた。 cerbero を使って全部入りをコンパイルをしてみました。これ注意!! cerbero は gstreamer がうごく全部入り環境を作るのであってOS にインストールするものを作る tool ではない!!(と思うよ)
で、できたライブラリ群を使う時には GST_PLUGIN_SYSTEM_PATH を"そこ(/cerbero/build/dist/linux_x86_64)"の gstreamer のライブラリに設定します。ついでに LD_LIBRARY_PATH も"そこ"の lib を指定します。
setenv GST_PLUGIN_SYSTEM_PATH =0/lib/gstreamer-1.0/ setenv LD_LIBRARY_PATH =0/lib
自分で単独で簡単な element 作った場合は GST_PLUGIN_PATH にそのライブラリのパスを通すみたいよ(まだやっていない)。
リンク集
以前にとりあえず情報だけ集めています。重複するかもしれないけど情報を。