GStreamer 事はじめ
blog
2020-8-31 21:42 JST

GStreamer をつかって画像の加工やら音の加工やらができそう。FPGA や GPU ともつながってきそうなのでelement が作れるくらいにはしたい。

まずは使ってみる

Ubuntu なら apt install をつかえばすぐにインストールできます。

apt install gstreamer1.0-plugins-base gstreamer1.0-tools

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 にそのライブラリのパスを通すみたいよ(まだやっていない)。

リンク集

以前にとりあえず情報だけ集めています。重複するかもしれないけど情報を。