コンテンツにスキップ

GStreamerの使用方法

1. GStreamerの使用紹介

1.1. GStreamerの紹介

GStreamerは、ストリーミングメディアアプリケーションを構築するためのオープンソースのマルチメディアフレームワークです。音声/動画アプリケーションの開発を簡素化することを目的としています。

1.1.1 基本概念

  • パイプライン (pipeline): 完全なGStreamerワークフロー。マルチメディアタスク処理の基本単位(必ずsourceクラスの【要素】で始まり、sinkクラスの【要素】で終わる必要があります)。

1.1.1 基本概念 図1

1.1.1 基本概念 図1

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

1.1.1 基本概念 図2

1.1.1 基本概念 図2

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

1.1.1 基本概念 図3

1.1.1 基本概念 図3

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

1.1. 1 基本概念 図4

1.1.1 基本概念 図4

1.1.2 GStreamerツール

  • gst-launch-1.0: パイプラインを構築して起動するための強力なツール。

  • gst-inspect-1.0: 利用可能なプラグインや要素の情報を表示します。

1.1.3 Gstreamerデバッグ情報

GST_DEBUG環境変数を使用してデバッグ情報を表示できます。

Terminal window
export GST_DEBUG=2

1.2. エンコード

MIPI-CSIまたはUSB Cameraに関するビデオノードは関連マニュアルで確認してください。

1.2.1 録画保存

シリアルデバッグまたはSSHデバッグで開発ボード環境に入ります。

1.2.1 録画保存 図5

1.2.1 録画保存 図5

cam0のデバイスノードがvideo23であると仮定します。以下のコマンドを入力して録画を行います。

Terminal window
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e

1.2.1 録画保存 図6

1.2.1 録画保存 図6

【Ctrl+C】を押して録画を終了すると、tsファイルが生成されます。

フレームレートや解像度を調整して録画することも可能です:

1.2. 1 録画保存 図7

1.2.1 録画保存 図7

# フレームレート調整

Terminal window
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! videoconvert ! mpph264enc ! mpegtsmux ! filesink location=./1.ts -e

# 解像度とフレームレート調整

Terminal window
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 -e

flv形式やH.264生ストリームでの録画も可能です。

Terminal window
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! h264parse ! flvmux ! filesink location=./1.flv -e

エレメンタリストリーム

Terminal window
gst-launch-1.0 v4l2src device=/dev/video23 ! mpph264enc ! filesink location=./1.h264 -e

1.2.2 UDPストリーミング

まず、gst_test.sdp という名前のファイルを作成します。

1.2.2 UDPストリーミング 図8

1.2.2 UDPストリーミング 図8

テキストエディタ(メモ帳など)でこのファイルを開き、以下の内容を追加してください(注意:2箇所のIPアドレスは、いずれもユーザーPCのIPアドレスに変更してください)。

Terminal window
Plaintext
v=0
o=- 0 0 IN IP4 192.168.10.111
s=H.264 Stream from RV1126
c=IN IP4 192.168.10.111
t=0 0
m=video 8554 RTP/AVP 96
a=rtpmap:96 H264/90000

続いて、作成したファイルを VLCメディアプレーヤーで開きます(下図を参照)。

1.2.2 UDPストリーミング 図9

1.2.2 UDPストリーミング 図9

1.2.2 UDPストリーミング 図10

1.2.2 UDPストリーミング 図10

Terminal window
adb shell

コマンドを使用して【開発ボード環境】にログインし、以下のコマンドを入力します(注意:コマンド内のIPアドレスはユーザーPCのIPアドレスに変更してください)。これにより、videoノードの映像がエンコードされ、UDP経由でPCのVLCへストリーム配信されます。

Terminal window
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ストリーミング 図11

1.2.2 UDPストリーミング 図12

1.2.2 UDPストリーミング 図12

1.2.3 RTSPサーバー

rtspServer関連のライブラリをインストールし、ソースコードを取得してコンパイルします。

Terminal window
sudo apt-get install libgstrtspserver-1.0-dev

インストールが【成功】した後、以下のコマンドを実行して rtspServer アプリケーションのソースコードを取得します:

Terminal window
wget https://raw.githubusercontent.com/GStreamer/gst-rtsp-server/1.14/examples/test-launch.c

その後、以下のコマンドでこのソースコードをコンパイルします:

Terminal window
gcc test-launch.c -o test-launch \$(pkg-config --cflags --libs gstreamer-1.0 gstreamer-rtsp-server-1.0)

test-launch の生成に成功したら、以下のコマンドでこの rtspServerを実行します:

Terminal window
./test-launch "v4l2src device=/dev/video23 ! mpph264enc ! rtph264pay name=pay0 pt=96"

最後に、VLC を使用し、ポート 8554 経由で RTSPストリームを受信(プル)します。

1.2.3 RTSPサーバー 図13

1.2.3 RTSPサーバー 図13

1.2.3 RTSPサーバー 図14

1.2.3 RTSPサーバー 図14

解像度とフレームレートを指定する場合は、以下の例を参考にしてください:

Terminal window
./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 録画ファイルのデコード

以下のコマンドを実行してデコードおよび再生を行います。

Terminal window
gst-launch-1.0 filesrc location=/userdata/1.ts ! tsdemux ! queue ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink

1.4.1 録画ファイルのデコード 図15

1.4.1 録画ファイルのデコード 図15

同じファイルが /userdata/ ディレクトリにある場合の、FLV形式動画の再生:

Terminal window
gst-launch-1.0 filesrc location=./1.flv ! flvdemux ! h264parse ! mppvideodec ! videoconvert ! videoflip method=1 ! autovideosink

H.264生ストリーム(Rawストリーム)動画の再生:

Terminal window
gst-launch-1.0 filesrc location=/userdata/1.h264 ! h264parse ! mppvideodec ! videoflip method=1 ! autovideosink sync=false

1.4.2 RTSPストリーム受信デコード

IPCameraからのストリームを受信して表示します。

Terminal window
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.4.2 RTSPストリーム受信デコード 図16

1.5. スプリッター(tee)の使用

映像を画面に表示しながら同時に録画する場合などにスプリッター(tee)を使用します。

Terminal window
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

1.5. スプリッター(tee)の使用 図17

コマンドは以下の3つの部分に分けて理解することができます:

第1の部分、ビデオストリームの取得:

Terminal window
gst-launch-1.0 v4l2src device=/dev/video23 ! video/x-raw,framerate=30/1 ! tee name=t

第2の部分、ビデオストリームを複製して表示ウィンドウ(autovideosink)へ出力:

Terminal window
t\. ! queue ! videoflip method=1 ! autovideosink sync=false

第3の部分、ビデオストリームを複製してエンコーダへ送り、最終的にTSファイルとしてパッケージ化:

Terminal window
t\. ! queue ! mpph264enc ! mpegtsmux ! filesink location=./1.ts

1.5.1 注意事項

スプリッタ(tee)の実装原理は、CPUを介してデータをコピーし、パイプラインに送るというものです。そのため、生フォーマット(YUV/RGBなど)のデータを処理するために使用すると、CPUおよびメモリの負荷(オーバーヘッド)が増大します。

1.6. gst-inspect-1.0の使用

全要素のリスト化

Terminal window
gst-inspect-1.0

5.6. gst-inspect-1.0の使用 図18

5.6. gst-inspect-1.0の使用 図18

特定の要素情報の確認

Terminal window
gst-inspect-1.0 v4l2src

1.6. gst-inspect-1.0の使用 図19

1.6. gst-inspect-1.0の使用 図19

1.7. GStreamerドキュメント

公式サイト: GStreamer公式ドキュメント