5

Web カメラを使用してビデオをキャプチャし、キャプチャしたビデオ フレームごとに 1 つの画像を出力する必要があります。

マルチファイルシンクで gstreamer を使用してみました。

gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,framerate=30/1 ! ffmpegcolorspace ! pngenc ! multifilesink location="frame%d.png"

ただし、これは実際にはすべてのフレームを出力するわけではありません。つまり、30 fps で 2 秒間記録すると、60 枚の画像が得られません。これは、エンコーディングがそれほど高速に実行できないためであると想定しているため、別の方法が必要です。

1 つのパイプラインでビデオをキャプチャし、別のパイプラインでそのビデオをフレームに変換すればうまくいくかもしれないと考えましたが、コーデックについて十分に知りません。ビデオを h264 や mp4 などのファイルにエンコードしてから再度デコードする必要がありますか?

誰か考えや提案はありますか?たとえば、Adobe Premiere などのアプリケーションを使用するのではなく、コードでこれを行う必要があることに注意してください。

ありがとう!

4

3 に答える 3

5

次のように、そこにキューを追加するだけです。

gst-launch v4l2src device=/dev/video1 ! video/x-raw-yuv,framerate=30/1 ! queue ! ffmpegcolorspace ! pngenc ! multifilesink location="frame%d.png"

これにより、ビデオ キャプチャが 30 fps で実行できるようになり、ディスクへの書き込みが独自のテンポで行われるようになります。この設定を長時間放置すると、キューが非常に大きなサイズになることに注意してください。

于 2013-06-26T21:40:20.600 に答える
2

私が提供しなければならない解決策は、gstreamer ではなく ffmpeg を使用します。あなたもそれでいいと思います。

このフォーラムの投稿で説明されているように、次のようなものを使用できます。

ffmpeg -i movie.avi frame%d.png

ビデオの各フレームの png/jpg 画像を取得します。
ただし、使用する入力ファイルによっては、ffmpeg を実行する前に MPEG vid に変換する必要がある場合があります。

注:
画像ファイル名に先行ゼロが必要な場合は、%05d代わりに使用します (C のような 5 桁の数字の場合printf()):

ffmpeg -i movie.avi frame%05d.png

出力ファイル形式はファイル拡張子に依存するため、. の代わりに.jpg, .bmp, ... を使用できます.png

于 2013-03-26T13:21:51.177 に答える
2

私はこれを2つの部分で行うことになりました。

ビデオをファイルに書き込みます。

gst-launch v4l2src device=/dev/video2 ! video/x-raw-yuv,framerate=30/1 ! xvidenc ! queue ! avimux ! filesink location=test.avi

後処理。

gst-launch-1.0 --gst-debug-level=3 filesrc location=test.avi ! decodebin ! queue ! autovideoconvert ! pngenc ! multifilesink location="frame%d.png"
于 2014-12-25T08:22:56.337 に答える