1

OK、それで私はウェブカメラのキャプチャに少し苦労していて、一貫したフレームレートでビデオをキャプチャする方法を見つけるために助けを必要としています。

私はAforge.AVIWriterとAforge.VideoFileWriterを使用していますが、役に立たず、考えられる関連フレーズもGoogleに入力しました。

DirectShowLibを確認しましたが、まだ正確ではありません。

ビデオの最小フレームレートは25fpsである必要があります。また、同時に収集される他のデータと同期して表示される必要があります。

私も無限ループを試しました:

        for (; ; )
        {
            if (recvid == false)
            {
                break;
            }
            if (writer.IsOpen)
            {
                Bitmap image = (Bitmap)videoSourcePlayer1.GetCurrentVideoFrame();
                if (image != null)
                {
                    writer.WriteVideoFrame(image);
                }
                Thread.Sleep(40);
            }


        }

これはタイミングに関してより正確ですが、ユーザーは、ビデオを見ると同時にデータを表示すると、fpsが変化することを確認できます。

私はここから行く方法を考えることができないので、どんなポインタやヒントも大歓迎です。

4

2 に答える 2

1

ほとんどの Web カメラ (まれな例外と、キャプチャ プロセスを細かく制御できるハイエンド カメラを除く) では、カメラのフレーム レートを十分に制御できません。カメラは、指定された操作モード、特に最大フレームレートでフレームのストリームをキャプチャします。解像度とデータ帯域幅によって制限され、低レベルの条件ではレートが低下する可能性があります。

Thread.Sleep25 fps をキャプチャするには、ハードウェアがスムーズに動作する必要があり、中断や「次のフレームを今すぐキャプチャする」という明示的な指示がなくても、新しいデータを一方の端にプッシュする必要があります。もう一方の端でキャプチャされたフレームをポップしてキューに入れます。通常、適切なハードウェアを使用しても、数フレームのビデオ ラグが発生します。

于 2012-07-19T16:58:33.480 に答える
1

私が見ることができる2つの主な問題:

writer.write() は別のスレッドで発生していますか? そうしないと時間がかかるため、タイミングが正確ではない可能性があります。

2番目のthread.sleep()は、正確に40ミリ秒ではなく、少なくとも40ミリ秒スリープすることを示しています..より良い結果を得るには、待機時間を5ミリ秒に短縮し、ループで実行します..システム時間を使用して、実際にどれくらいの長さかを把握しますあなたは寝て、フレームキャプチャを取りました。

お役に立てれば

于 2012-07-19T16:17:58.213 に答える