NVIDIA DeepStream SDKは、DeepLearningを用いた動画認識用のSDKで、物体認識や動画像処理などを高速に行うことができます。Jetson向けにも配布をしており、下記リンクからダウンロードすることができます。
ダウンロードしたファイルには、サンプルコードがいくつか入っていますが、自分でカスタマイズをする際に、概要を理解しておく必要があるかと思い、まとめてみました。
まずは、DeepStream SDKを扱うにあたり、欠かせないのがGStreamerです。DeepStream SDKはGStreamerにプラグインを提供しており、c言語で書かれたサンプルコードもGStreamerを前提に組まれているためです。
GStreamerとは?
GStreamerとは、オープンソースのマルチメディア処理ソフトウェアです。音声・動画などのマルチメディアを入力し、変換・切り抜きなどの処理をした後、ファイルやストリーミング等で出力することができます。
ffmpegとの違い
マルチメディア処理のソフトウェアというとffmpegをまず最初に思い浮かべる方も多いかと思います。
概ね「ffmpegに似たようなもの」という理解で良いとは思いますが、ffmpegと比べた時の利点としては、「GStreamerの方がプラグインが多く、カスタマイズ性が高い」という点かと思います。
ffmpegは単体でデコード/エンコード/フィルタリングなど、様々な機能を含んでいるのに対し、GStreamerが提供するのはフレームワークのみで、基本的にプラグインを入れないと何もできません。逆に、GStreamerの方がカスタマイズ性が高いとも言えそうです。
ffmpegはコマンドが簡易なので、パッと処理をしたい時には便利ですが、色々な機能を組み合わせて自前のマルチメディア処理ソフトウェアを構築する際はGStreamerの方が良いと考えられます。(現にDeepStream SDKもGStreamerにしかプラグイン提供していないので)
GStreamerの基本構造
GStreamerの基本構造は下記URLに記載されています。
マルチメディアの処理はpipelineという一連の処理として表され、それぞれの要素をelementと呼んでいます。また、それぞれのelementの接続部分をpadと呼んでいて、src padから出力されたデータをsink padで受け取るようになっています。
上記のoggプレイヤーの例では、oggのファイルをsource elementが読み込み、ogg-demuxerが音声と動画に分解し、それぞれのdecoder elementがでコードを行い、スピーカーとディスプレイに出力されるというpipelineを示しています。
また、src padとsink padでやりとりされているオブジェクトのことをbufferと呼んでいます。各elementからは処理の状態の情報などがアプリケーション側に送られますが、これをmessageと呼んでいます。
現在の再生時間やファイルの長さなどの情報を取得する際はqueryをアプリケーション側から投げると同期的にレスポンスが返却されます。
GstElementについて
GStreamerでは、各要素のことをGstElementと呼んでおり、pipeline、source、sinkなど全てGstElementによって表されます。
pipeline
全体の流れを作るGstElementです。このpipelineをまず作成した上で、各処理をこのpipelineに追加していき、pipelineを開始することでストリーム処理が開始されます。
source element
マルチメディアのインプットになります。データの受け入れは行わず、生成のみを行います。例えば、Webカメラからのデータ読み込み・動画ファイルの読み込み等を行うことが可能です。
filter
filterはその名の通り、入れたデータを変換した上で次に渡すGstElementになります。例えば、動画形式の変換・画角の変換・カラーコード変換等の処理を行うことが可能です。
demuxer
demuxerは1つのインプットに複数のマルチメディア要素が含まれている場合に分けてくれるGstElementです。例えば、動画ファイルを読み込んだ際、音声データと動画データに分けることが可能です。
sink
sinkは処理後のマルチメディアをどのようにアウトプットするかを定義するGstElementです。例えば、ファイル保存・ウィンドウで再生・RTSPによるストリーミング配信などのアウトプットをすることが可能です。