繁体   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