Armadilloフォーラム

MJPEG対応UVCカメラからのH.264エンコードについて

kihara

2016年2月26日 21時25分

エルム 木原です。
お世話になっております。

UVCカメラからの映像を、H.264にエンコードする処理において、フレームレートが
上がらずに悩んでおります。
下記コマンドを実行したところ、7FPS程度しか出ませんでした。

gst-launch-1.0 -e v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720,framerate=60/1 ! jpegdec ! videoconvert ! video/x-raw,format=NV12,framerate=60/1 ! acmh264enc ! queue ! qtmux ! filesink location=mnt/output.mp4

YUV2を転送するとUVCカメラ本体の制限によりFPSが上がらない為、MJPEGを
使用しています。
何か良い方法が無いかご教授願います。

コメント

at_shota.tamura

2016年2月29日 15時35分

田村です。

> gst-launch-1.0 -e v4l2src device=/dev/video0 !image/jpeg,width=1280,height=720,framerate=60/1 ! jpegdec ! videoconvert !video/x-raw,format=NV12,framerate=60/1 ! acmh264enc ! queue ! qtmux !filesink location=mnt/output.mp4

jpegdec, videoconvert にCPUリソースを使っていそうですね。

> YUV2を転送するとUVCカメラ本体の制限によりFPSが上がらない為、MJPEGを
> 使用しています。
> 何か良い方法が無いかご教授願います。

MP4 で保存することは必須ですか?

もしそうでなければ、jpeg をデコードせずに
avimux を使って .avi で保存すればFPSは向上しそうです。
※ただ、ファイルサイズが大きくなってしまいますが。。

 v4l2src ! image/jpeg,width=1280,height=720,framerate=60/1 ! queue ! avimux ! filesink

すでに試しているようでしたら申し訳ありません。

kihara

2016年2月29日 18時24分

> jpegdec, videoconvert にCPUリソースを使っていそうですね。
CPUリソースが100%になっていることを確認しました。

> MP4 で保存することは必須ですか?
必須です。リアルタイム性も必要になります。

R-Mobile A1にはJPEG codecが搭載されているようですが、
これを利用することはできませんか?

at_shota.tamura

2016年3月1日 10時22分

> R-Mobile A1にはJPEG codecが搭載されているようですが、
> これを利用することはできませんか?

申し訳ありません。R-Mobile A1を活用したJPEGエンコーダーの
Element はあるのですが、JPEGデコーダーの Element は無いためできません。。

私の最初の返信が誤解を招くような内容でしたので、情報の整理をさせていただきます。

FPSが上がらないいくつかの要因の中で、最も支配的なのものは
videoconvert を使った時に発生する「メモリコピー」です。
※もちろん、フォーマット変換処理自体もCPUリソースは使いますがメモリコピーの方が支配的です。

回数にだけ注目しても、v4l2src から acmh264enc に入るまでに
【videoconert 無し】と【videoconvert 有り】では3倍の差があります。

【videoconvert 無し】
v4l2src ! video/x-raw,format=NV12 ! acmh264enc ! ...
      ^^^^^
      1回目
 
【videoconvert 有り】
v4l2src ! video/x-raw,format=I420 ! videoconvert ! video/x-raw,format=NV12 ! acmh264enc ! ...
      ^^^^^                     ^^^^^          ^^^^^
      1回目                      2回目          3回目

このことから、videoconvert を使ったパイプラインで、
望まれているFPSを達成することは現実的ではありません。

なので、videoconvert 使わないパイプラインで処理することを
検討してみてはいかがでしょうか。

具体的には「NV12 で取り込めるカメラを使う」という方法があります。

v4l2src ! video/x-raw,format=NV12 ! acmh264enc ! queue ! qtmux ! filesink
# NV12 で取り込めるカメラを使用すれば、videoconvert を使わずに済みます。

弊社推奨品デバイスにもNV12で取り込むことのできる、
FullHD対応カメラモジュール[*1]がありますので検討してみてください。

[*1]: http://armadillo.atmark-techno.com/devices/KBCR-S02TXG

kihara

2016年3月1日 13時02分

詳しい御回答ありがとうございます。

Armadillo-840とMJPEG対応UVCカメラの組み合わせでは、高い
FPS(最低でも20FPS)を実現するのは難しそうですね。

諦める前に幾つか質問させてください。

・R-Mobile A1のJPEGデコーダー Elementの提供予定は
今後もありませんか?

・ サードパーティー含め、NV12を出力できるJPEGデコーダーElementは
無いでしょうか?

at_yashi

2016年3月1日 14時05分

> ・R-Mobile A1のJPEGデコーダー Elementの提供予定は
> 今後もありませんか?

ごめんなさい。今とのころ、ありません。

NV12出力の jpeg decoder の方は知らないです。すみません。
(uとvの配置だけ変えれば良いので、できそうですけどね)