3

Logitech Webcam を持っています。使用可能なフォーマットを一覧表示すると、(とりわけ) 次のように表示されます。

Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUV 4:2:2 (YUYV)
        Size: Discrete 640x480
            Interval: Discrete 0.033s (30.000 fps)
            Interval: Discrete 0.040s (25.000 fps)
            Interval: Discrete 0.050s (20.000 fps)
            Interval: Discrete 0.067s (15.000 fps)
            Interval: Discrete 0.100s (10.000 fps)
            Interval: Discrete 0.200s (5.000 fps)

だから今、私は640x480 @ 30fpsの解像度で300フレームをキャプチャし、それらをjpeg圧縮してaviに多重化したいと考えています。300 フレーム @30fps をキャプチャすると 10 秒のムービーになり、記録に 10 秒かかるはずですが、私の場合、300 フレームを取得するのに約 40 秒かかりますが、予想どおり 10 秒のビデオになります。

これは私のパイプラインです:

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=300 ! \
"video/x-raw,width=640,framerate=30/1" ! jpegenc ! avimux ! \
filesink location=output.avi

fpsdisplaysinkで確認したところ、多くのフレームがドロップされました。

last-message = rendered: 48, dropped: 250, fps: 1.88, drop rate: 5.64

だから明らかに私はカムから30fpsを取得しません. USB 2.0 経由で接続されるため、十分な帯域幅が利用可能です。Gstreamer は、PC が遅くなったり、その他のことについて文句を言ったりしません。

これはカメラの問題ですか、fps について嘘をついていますか、それとも何か不足していますか? また、ドロップされるフレームが非常に多いのはなぜですか?

編集1:

より良い照明条件で試してみました。guvcview露出を固定値に設定します。上限を 15 fps に設定すると、結果は期待どおりです。150 フレームをキャプチャすると、10 秒のビデオになり、10 秒かかります。

また、300 フレーム @30fps を記録するのに必要な時間は 20 秒に短縮されました。

では、適切な設定を見つけてみましょう。固定露出時間で遊んでみたところ、露出時間が長くなるほど、10 秒あたり 300 フレームに近づくことがわかりました。したがって、露出を 300 に設定すると、10 秒で 30fps で 300 フレームを記録するという私の問題が解決されました。

ここで非常に興味深いのは、fpsdisplaysink でストリームを検査すると、ほぼすべてのフレームがドロップされていることが示されることです。

last-message = rendered: 1, dropped: 298, fps: 0.00, drop rate: 30.07 

編集2:

わかりました、videorate を使用して 30 fps に固定すると、ディスプレイ シンクは基本的にドロップ フレームがなく、30 fps の一定レートを示します。

結果のパイプラインは次のとおりです。

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=300 ! \
"video/x-raw,width=640,framerate=30/1" ! \
videorate ! "video/x-raw,framerate=30/1" ! tee name=a ! \
queue ! jpegenc ! avimux ! filesink location=output.avi a. ! \ 
queue ! fpsdisplaysink
4

1 に答える 1

8

ウェブカメラの設定をいじって問題を解決しました。露出をデフォルトの 150 から 300 に増やすとうまくいきました。

また、videorateを使用して特定のフレームレートを修正します。

640x480 の解像度で 300 フレームを 30 fps で 10 秒で記録するための私のパイプラインは、次のようになります。

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=300 ! \
"video/x-raw,width=640,framerate=30/1" ! \
videorate ! "video/x-raw,framerate=30/1" ! \
jpegenc ! avimux ! filesink location=output.avi
于 2014-02-23T11:36:40.833 に答える