簡體   English   中英

在 C# 中處理視頻幀(FFMPEG 慢)

[英]Processing Video Frames in C# (FFMPEG Slow)

我正在嘗試從 mp4 視頻中提取幀以處理它們。

即視頻圖像中有一個水印/時間戳,我想用它來自動將視頻拼接在一起。 視頻創建日期不足以完成此任務。 在此處輸入圖片說明

用AI從視頻中提取文本的部分也很好。

但是,FFMPEG 似乎非常慢。 源視頻為 1080p/60fps(每 5 分鍾視頻大約 1GB)。

到目前為止,我使用 Accord.FFMPEG 包裝器嘗試了兩種方法:

public void GetVideoFrames(string path)
{
    using (var vFReader = new VideoFileReader())
    {
        // open video file
        vFReader.Open(path);
        // counter is beeing used to extract every xth frame (1 Frame per second)
        int counter = 0;
        for (int i = 0; i < vFReader.FrameCount;i ++)
        {
            counter++;
            if (counter <= 60)
            {
                _ = vFReader.ReadVideoFrame();
                continue;
            }
            else
            {
                Bitmap frame = vFReader.ReadVideoFrame();
                // Process Bitmap
            }
        }
    }
}

另一種嘗試:

for (int i = 0; i < vFReader.FrameCount;i+= 60)
{
    // notice here, I am specifying which exact frame to extract
    Bitmap frame = vFReader.ReadVideoFrame(i);
    // process frame
}

第二種方法是我第一次嘗試的,完全行不通。 顯然 FFMPEG 對每個特定幀進行了新的搜索,因此處理的每個幀的操作時間越來越長。 在 5 幀之后,生成一幀大約需要 4 秒。

第一種方法至少似乎沒有那么嚴重地受到這個問題的影響,但它仍然需要大約 2 秒才能產生一個幀。 按照這個速度,我可以更快地手動處理視頻。

我的方法有什么問題嗎? 我也不想有一個解決方案,我需要在目標機器上單獨安裝第三方庫。 因此,如果有任何替代方案,我很樂意嘗試它們,但似乎堆棧溢出的每個人都指向 ffmpeg 或 opencv。

我認為問題不在於 FFmpeg,而在於 Accord 包裝器在尋找。 我建議直接在單次傳遞中使用 ffmpeg 來提取幀,因為它可以選擇僅提取關鍵幀或每 X 幀(或者您可以只使用嵌入的視頻時間戳...)。 但是如果你想繼續你的路徑,那么也許可以考慮傳遞所需的幀索引而不是 for 循環 - 它應該更快,也許你可以並行化它。

但它會更快做所有在一個單獨的ffmpeg的過程。

暫無
暫無

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

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