こんにちは。生のカメラフレームをファイルに書き込む際に、スループット/フレームレートの問題が発生しています。フレームをストレージに書き込むと、実際のキャプチャレートが目標フレームレートを大幅に下回ります。書き込みを行わない純粋なキャプチャはフルフレームレートで動作するにもかかわらずです。私たちはその原因を理解したいのです。以下は、当社の環境設定です。
- ボード: i.MX95 19x19 LPDDR5 EVK
- BSP:TechNexion Yocto 5.3(Whinlatter)、カーネル6.18.2
- カメラ:TechNexion TEVS-AR0234 (MIPI CSI-2)
- キャプチャ装置はmedia-ctlで確認:tevs → csidev-4ad30000.csi → formatter@20 → クロスバー→ mxc_isi.0→ /dev/video0
## テスト 1: キャプチャのみ、書き込みなし (ベースライン)
センサーが30fpsにロックされている方法:
V4L2-ctl -d /dev/v4l-subdev19 --set-subdev-fps pad=0,stream=0,fps=30
gst-launch-1.0-e libcamerasrc !video/x-raw、幅=1920、高さ=1080、フォーマット=YUY2、フレームレート=30/1 !fpsdisplaysink video-sink=fakesink text-overlay=false sync=false
結果:安定した29.98fps、フレーム落ちなし。
## テスト2:生のフレームをファイルに書き込む
gst-launch-1.0-e libcamerasrc !video/x-raw、幅=1920、高さ=1080、フォーマット=YUY2、フレームレート=30/1 !filesink location=/tmp/test.yuv
結果:約11.7fps(ファイルサイズ/キャプチャ時間で測定)、GStreamerログには繰り返し警告が表示されました。
警告 NxpNeoPipe neo_pipeline.cpp:3175画像0フレームが失われました!X を期待していたが Y を受け取った。
FPSがロックされていないと期待と受信の差は時間とともに広がりますが、センサーのFPSがターゲットに合わせるようにロックされると、1〜2フレームほど小さく保たれます。
`libcamerasrc`の代わりに`v4l2src device=/dev/video0`を使用して同じテストを繰り返しました。結果は同じ約11.7~11.8fpsでした。
同じテストを1280x720で繰り返したところ、約28.8fps(約53MB/s)となり、これは上記の1920x1080のテスト(約52MB/s)と同様のMB/sの上限値に相当します。
`/dev/video0` (mxc-isi) からキャプチャした生のフレームをストレージに書き込む際に、書き込み速度が約 50 MB/s に制限されるのは、現在の BSP/カーネル バージョンにおける想定される動作なのか、それとも設定項目を見落としている可能性があるのかを知りたいです。必要に応じて、完全なログ、『media-ctl』トポロジー出力、デバイスツリー情報の提供も喜んで承ります。
こんにちは、 @JosephAtNXPさん、迅速なご対応ありがとうございます。
根本原因が以下の要因にあるかどうか確認したい。さらに、この場合にReal-Time Yoctoを使うのは役立つでしょうか?
キャプチャされたフレームは、連続メモリ割り当て器(CMA)によって割り当てられたDMAバッファに格納されます。ISPハードウェアからこのメモリへのDMA書き込みはボトルネックになったことはありません(ddを使ったローカルtmpfsの書き込み速度は最大819 MB/sに達し、ストレージメディアの制限は除外されます)。
ボトルネックは、CPUがこのバッファの内容を読み取るステップで発生します。これは、VPUハードウェアエンコーダがDMA経由で同じバッファを直接読み取ってもパフォーマンスに影響がないという事実によっても裏付けられています。これは、ボトルネックの原因がバス帯域幅やストレージデバイスの速度制限ではなく、メモリのキャッシュ属性構成、あるいは各バッファデキュー操作中のキャッシュコヒーレンシの維持コスト(例えば、キャッシュ無効化)にあることを強く示唆している。
こんにちは、
NXP Semiconductors製品にご関心いただきありがとうございます。
これはLinuxユーザーガイドで見られるように、予想される動作です。
さらに、フレームをファイルシステムに書き込むと、リアルタイムでは処理しきれないほどの膨大な量のデータが生成されます。その場合、アプリケーションがバッファをリサイクルする際に遅延が生じるため、周期的なフレームロスが発生することが予想されます。
回避策としては、キャプチャされたフレームを保存する前にハードウェアのビデオエンコーディングを使う方法があります。
よろしくお願いします。