
USB カメラを使用してビデオを録画しようとしていますが、使用時に問題が発生していますffmpeg
。
を実行するとffmpeg -f video4linux2 -t 00:00:10 -i /dev/video0 out.mpg
、プログラムは 640x480 の解像度で録画しようとしてffmpeg
ハングします。
ただし、 を追加して-s
640x480ffmpeg
より低い解像度 (例: 320x240) で録画すると、ビデオは正常に録画されます。
ハングアップ後、 を押すとCTRL+C
、ffmpeg が再開し、サイズが 0 kB のファイルが生成されます。 を使用すると、デバイスへの呼び出しが を返し、後続のが を返すことstrace
がわかります。ioctl
-EINVAL
ioctl
-EAGAIN
ioctl(3, VIDIOC_G_STD, 0xbe84dfb0) = -1 EINVAL (Invalid argument)
ioctl(3, VIDIOC_DQBUF, {type=V4L2_BUF_TYPE_VIDEO_CAPTURE}) = -1 EAGAIN (Resource temporarily unavailable)
なぜこのようなことが起こるのか、何か考えはありますか?
私はバージョン 1.25ffmpeg
でビルドされたバージョン 2.8.7を使用していますbusybox
。ホスト アーキテクチャはカーネル 3.2 を実行する ARM プロセッサです。
最新バージョンをソースからコンパイルすることも試みましたが、問題は解決しません...
答え1
原因が分かりました: トランスコーディングと生データの量。
質問で述べたコマンドラインを使用して、RAW 形式 (yuv422) から読み取り、それを の私のバージョンのデフォルトのエンコードである mpeg-1 にトランスコードしていましたffmpeg
。カメラからストリーミングされるデータ量がプロセッサにとって多すぎて、ハングアップが発生しました。使用していたカメラは、圧縮形式 (mjpeg) でもストリーミングできました。この形式に切り替えると、ffmpeg
ハングアップしなくなり、15 fps で録画できるようになりました。
ffmpeg
ただし、mjpeg から mpeg-1 へのトランスコーディング手順がありました。ストリームをコピーするように指示し、最後のトランスコーディング手順を削除することで、より高い fps 数を達成できました。