Jetsonビデオ処理プログラミング 第7話 動画デコード

前回の動画エンコードに続いて、今回は動画デコードを取り上げさせていただきます。エンコードと同様、Jetsonは動画デコード専用のハードウェアアクセラレーター NVIDIA Video Decoder Engine(NVDEC)も内蔵します。Jetsonを効率的に利用するには、デコードはこのNVDECにより実行する必要があります。そのために利用できるAPIはエンコードの場合と同じくGStreamerとJetson Multimedia APIです。

[Jetsonビデオ処理プログラミング]

第1話 NVIDIA提供 JetPackとSDKでできること

第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)

第3話 ビデオ入力(USB接続のV4L2準拠カメラ)

第4話 リサイズとフォーマット変換

第5話 画像表示

第6話 動画エンコード

第7話 動画デコード

第8話 画像処理

第9話 ディープラーニング推論

第10話 計算リソースの最大活用

実装方法

NVDECによる動画デコードを実装する方法は以下のとおりです。

API プログラミング言語 コメント
GStreamer
  • C
  • Python
  • 代表的なな選択肢
  • 実例も豊富
  • マルチプラットフォーム
Jetson Multimedia API
  • C
  • 詳細な設定が可能
  • V4L2準拠

GStreamerを利用

GStreamerパイプラインのプロトタイピング

エンコードの場合と同様に、gst-launch-1.0コマンドでデコード処理のプロトタイピングができます。

たとえば、H.264コーデックでエンコードされ、MP4コンテナに格納されているtest.mp4というファイルをデコードして、モニターへ表示するパイプラインは以下のとおりです。

gst-launch-1.0 -e \
filesrc location=test.mp4 ! \
qtdemux name=demux demux.video_0 ! \
queue ! \
h264parse ! \
nvv4l2decoder ! \
nvegltransform ! \
nveglglessink

GStreamer API

エンコードの場合と同様、コマンドラインでプロトタイピングの後は、GStreamer APIでアプリケーションへ組み込みます。

C API

Python API

OpenCVからGStreamerを利用

JetPackでインストールされるデフォルトのOpenCVはJetson固有のハードウェアアクセラレーターが有効になっていませんが、OpenCV VideoCaptureのバックエンドをGStreamerとすることで、OpenCVからNVDECによる高速動画デコードが利用できます。

appsinkプラグインで、デコードしたストリームデータをOpenCVへ渡すことができます。

import cv2
import sys
FILE = 'test.mp4'
GST_COMMAND = 'filesrc location={} ! qtdemux name=demux demux.video_0 ! queue ! h264parse ! nvv4l2decoder ! nvvidconv ! video/x-raw,format=(string)I420 ! videoconvert ! appsink'.format(FILE)
cap = cv2.VideoCapture(GST_COMMAND)
if not cap.isOpened():
    print("Cannot open stream")
    sys.exit()
while True:
    ret, frame = cap.read()
    if ret == False:
        break
    cv2.imshow("Test", frame)
    key = cv2.waitKey(1)
    if key == 27: # ESC
        break
cv2.destroyAllWindows()
cap.release()
sys.exit()

Multimedia APIを利用

Jetson Multimedia APIに含まれるV4L2 Video DecoderでもNVDECを利用した動画デコードが利用可能です。

利用方法は、JetPackに含まれるサンプルコードを参照ください。サンプルコードはJetson上の以下のパスに存在します。

/usr/src/jetson_multimedia_api/samples

次回は、画像処理について解説します!

連載記事「Jetsonビデオ処理プログラミング」の第7話、動画デコードについてご紹介しましたがいかがでしたでしょうか。

次回は、画像処理についてご紹介します。

お困りのことがあれば、ぜひお問い合わせください

弊社ではハードウェアのNVIDIA GPUカードやGPUワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。