GStreamerの使用方法
1. GStreamerの使用紹介
1.1. GStreamerの紹介
GStreamerは、ストリーミングメディアアプリケーションを構築するためのオープンソースのマルチメディアフレームワークです。音声/動画アプリケーションの開発を簡素化することを目的としています。
1.1.1 基本概念
- パイプライン (pipeline): 完全なGStreamerワークフロー。マルチメディアタスク処理の基本単位(必ずsourceクラスの【要素】で始まり、sinkクラスの【要素】で終わる必要があります)。

1.1.1 基本概念 図1
- 要素 (element): ワークフロー内の各ノード(source、filter、sinkなど)。要素間は【パイプ】を介してデータを伝達します。

1.1.1 基本概念 図2
- パッド (Pad): データが要素に出入りするためのインターフェース。入力パッドはsinkPads、出力パッドはsrcPadsと呼ばれます。

1.1.1 基本概念 図3
一部のエレメントは複数のパッドを持っています。例えば、デマルチプレクサ(demuxer)やティー(tee)などです。

1.1.1 基本概念 図4
1.1.2 GStreamerツール
-
gst-launch-1.0: パイプラインを構築して起動するための強力なツール。
-
gst-inspect-1.0: 利用可能なプラグインや要素の情報を表示します。
1.1.3 Gstreamerデバッグ情報
GST_DEBUG環境変数を使用してデバッグ情報を表示できます。
export GST_DEBUG=21.2. エンコード
MIPI-CSIまたはUSB Cameraに関するビデオノードは関連マニュアルで確認してください。
1.2.1 録画保存
シリアルデバッグまたはSSHデバッグで開発ボード環境に入ります。

1.2.1 録画保存 図5
cam0のデバイスノードがvideo23であると仮定します。以下のコマンドを入力して録画を行います。
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e
1.2.1 録画保存 図6
【Ctrl+C】を押して録画を終了すると、tsファイルが生成されます。
フレームレートや解像度を調整して録画することも可能です:

1.2.1 録画保存 図7
# フレームレート調整
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! videoconvert ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e# 解像度とフレームレート調整
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,width=1280,height=800,framerate=30/1 ! videoconvert ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -eflv形式やH.264生ストリームでの録画も可能です。
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! h264parse ! flvmux ! filesink location=./1.flv -eエレメンタリストリーム
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! filesink location=./1.h264 -e1.2.2 UDPストリーミング
まず、gst_test.sdp という名前のファイルを作成します。

1.2.2 UDPストリーミング 図8
テキストエディタ(メモ帳など)でこのファイルを開き、以下の内容を追加してください(注意:2箇所のIPアドレスは、いずれもユーザーPCのIPアドレスに変更してください)。
Plaintextv=0o=- 0 0 IN IP4 192.168.10.111s=H.264 Stream from RV1126c=IN IP4 192.168.10.111t=0 0m=video 8554 RTP/AVP 96a=rtpmap:96 H264/90000続いて、作成したファイルを VLCメディアプレーヤーで開きます(下図を参照)。

1.2.2 UDPストリーミング 図9

1.2.2 UDPストリーミング 図10
adb shellコマンドを使用して【開発ボード環境】にログインし、以下のコマンドを入力します(注意:コマンド内のIPアドレスはユーザーPCのIPアドレスに変更してください)。これにより、videoノードの映像がエンコードされ、UDP経由でPCのVLCへストリーム配信されます。
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! mpph264enc ! h264parse ! rtph264pay config-interval=1 ! queue max-size-buffers=100 leaky=downstream ! udpsink host=192.168.10.111 port=8554 sync=false実行結果(動作)は以下の通りです:

1.2.2 UDPストリーミング 図11

1.2.2 UDPストリーミング 図12
1.2.3 RTSPサーバー
rtspServer関連のライブラリをインストールし、ソースコードを取得してコンパイルします。
sudo apt-get install libgstrtspserver-1.0-devインストールが【成功】した後、以下のコマンドを実行して rtspServer アプリケーションのソースコードを取得します:
wget https://raw.githubusercontent.com/GStreamer/gst-rtsp-server/1.14/examples/test-launch.cその後、以下のコマンドでこのソースコードをコンパイルします:
gcc test-launch.c -o test-launch \$(pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0)test-launch の生成に成功したら、以下のコマンドでこの rtspServerを実行します:
./test-launch "v4l2src device=/dev/video23 ! mpph264enc ! rtph264pay name=pay0 pt=96"最後に、VLC を使用し、ポート 8554 経由で RTSPストリームを受信(プル)します。

1.2.3 RTSPサーバー 図13

1.2.3 RTSPサーバー 図14
解像度とフレームレートを指定する場合は、以下の例を参考にしてください:
./test-launch "v4l2src device=/dev/video23 ! video/x-raw,width=1920,height=1080,framerate=30/1 ! videoconvert ! mpph264enc ! rtph264pay name=pay0 pt=96"1.3 注意事項
エンコードの際は、エンコード形式の最大能力を超えるフレームレートを設定しないでください。
1.4. デコード
1.4.1 録画ファイルのデコード
以下のコマンドを実行してデコードおよび再生を行います。
gst-launch-1.0 filesrc location=/userdata/1.ts ! tsdemux ! queue ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink
1.4.1 録画ファイルのデコード 図15
同じファイルが /userdata/ ディレクトリにある場合の、FLV形式動画の再生:
gst-launch-1.0 filesrc location=./1.flv ! flvdemux ! h264parse ! mppvideodec ! videoconvert ! videoflip method=1 ! autovideosinkH.264生ストリーム(Rawストリーム)動画の再生:
gst-launch-1.0 filesrc location=/userdata/1.h264 ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false1.4.2 RTSPストリーム受信デコード
IPCameraからのストリームを受信して表示します。
gst-launch-1.0 rtspsrc location=rtsp://admin:a12345678@192.168.5.68 ! rtph264depay ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false
1.4.2 RTSPストリーム受信デコード 図16
1.5. スプリッター(tee)の使用
映像を画面に表示しながら同時に録画する場合などにスプリッター(tee)を使用します。
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! tee name=t t. ! queue ! videoflip method=1 ! autovideosink sync=false t. ! queue ! mpph264enc ! mpegtsmux ! filesink location=./1.tsノード図解:

1.5. スプリッター(tee)の使用 図17
コマンドは以下の3つの部分に分けて理解することができます:
第1の部分、ビデオストリームの取得:
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! tee name=t第2の部分、ビデオストリームを複製して表示ウィンドウ(autovideosink)へ出力:
t\. ! queue ! videoflip method=1 ! autovideosink sync=false第3の部分、ビデオストリームを複製してエンコーダへ送り、最終的にTSファイルとしてパッケージ化:
t\. ! queue ! mpph264enc ! mpegtsmux ! filesink location=./1.ts1.5.1 注意事項
スプリッタ(tee)の実装原理は、CPUを介してデータをコピーし、パイプラインに送るというものです。そのため、生フォーマット(YUV/RGBなど)のデータを処理するために使用すると、CPUおよびメモリの負荷(オーバーヘッド)が増大します。
1.6. gst-inspect-1.0の使用
全要素のリスト化
gst-inspect-1.0
5.6. gst-inspect-1.0の使用 図18
特定の要素情報の確認
gst-inspect-1.0 v4l2src
1.6. gst-inspect-1.0の使用 図19
1.7. GStreamerドキュメント
公式サイト: GStreamer公式ドキュメント