前回の動画エンコードに続いて、今回は動画デコードを取り上げさせていただきます。エンコードと同様、Jetsonは動画デコード専用のハードウェアアクセラレーター NVIDIA Video Decoder Engine(NVDEC)も内蔵します。Jetsonを効率的に利用するには、デコードはこのNVDECにより実行する必要があります。そのために利用できるAPIはエンコードの場合と同じくGStreamerとJetson Multimedia APIです。
[Jetsonビデオ処理プログラミング]
第1話 NVIDIA提供 JetPackとSDKでできること
第2話 ビデオ入力(CSI接続のLibargus準拠カメラ)
第7話 動画デコード
実装方法
NVDECによる動画デコードを実装する方法は以下のとおりです。
API | プログラミング言語 | コメント |
GStreamer |
|
|
Jetson Multimedia API |
|
|
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でアプリケーションへ組み込みます。
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ワークステーションの選定やサポート、また顔認証、導線分析、骨格検知のアルゴリズム、さらに学習環境構築サービスなどを取り揃えております。お困りの際は、ぜひお問い合わせください。