簡體   English   中英

Emgu CV視頻播放緩慢嗎?

[英]Emgu CV video playing is slow?

我正在嘗試從磁盤打開視頻文件,並嘗試使用openCV包裝器播放視頻文件:Visual Studio C#中的Emgu CV。 我正在使用Emgu CV提供的imagebox在窗體上顯示我的視頻。 我使用以下代碼計算顯示下一幀視頻的等待時間:

await Task.Delay(Convert.ToInt32( 1000.0 / FPS));

問題是視頻播放速度比計算公式慢。 我打開一個29.97 FPS視頻文件,公式應返回(1000/30)= 33。 但是當我播放視頻時,我可以立即看到視頻播放速度低於33 FPS。 如果我通過右鍵單擊imagebox進入我的imagebox屬性,它表示FPS為21,我想這是實際播放的FPS視頻。 怎么了?

這是我的代碼。 這是非常基本的:

public partial class Form1 : Form
{

    VideoCapture videoCapture;
    double FPS;
    double totalFrames;
    int currentFrameNo;

    public Form1()
    {
        InitializeComponent();
    }

    private void btnOpen_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            videoCapture = new VideoCapture(ofd.FileName);
            FPS = videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
            totalFrames = videoCapture.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount);
            currentFrameNo = 0;
        }
    }

    private async void btnPlay_Click(object sender, EventArgs e)
    {
        while (currentFrameNo<totalFrames)
        {
            imageBox1.Image = videoCapture.QueryFrame();
            currentFrameNo += 1;
            await Task.Delay(Convert.ToInt32( 1000.0 / FPS));
        }
    }
}

我想要的是流暢播放。 應該改變什么? 對不起,我的語言不好。

正如其他評論所建議的那樣-問題是無論循環處理時間是多少,都會添加恆定的延遲。

更好的解決方案是使用Timer(大約!),如下所示:

bool playingVideo = false;
Timer frameTimer = new Timer(this.GrabFrame, null, 0, 1000 / 33);

private void btnPlay_Click(object sender, EventArgs e)
{
    playingVideo = true;
}


private void GrabFrame(object sender, EventArgs e)
{
    if(playingVideo)
    {
        while (currentFrameNo<totalFrames)
        {
            imageBox1.Image = videoCapture.QueryFrame();
            currentFrameNo += 1;
        }
    }
}

這樣,無論捕獲時間如何,每33ms將請求一次幀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM