【问题标题】:Processing Video Frames in C# (FFMPEG Slow)在 C# 中处理视频帧(FFMPEG 慢)
【发布时间】:2020-12-27 14:35:25
【问题描述】:

我正在尝试从 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。

【问题讨论】:

  • 你不是把每一帧都拉成图像吗?为什么你期望它很快?当您说将视频拼接在一起时,您到底是什么意思?
  • 没有。方法 1(更快)确实是拉动每一帧,并倾倒其中的大部分。当然,它的速度很慢。这就是为什么我首先使用方法 2,期望 ffmpeg 会从流中的最后一个已知位置开始搜索。但显然,它每次都从位置 0 开始寻找。所以方法 2(不应该)拉动每一帧,但它的方式会慢一些。
  • 好的,这样你就可以在同步它们之后并排渲染它们吗?
  • 几年前,我使用 DirectShow(用 C++ 编写的自定义过滤器)实现了这样的功能。它非常快。如果你需要性能,我认为你应该切换到原生。
  • 您可以使用 DirectShow 或 Media Foundation。这些是 Windows 的本机技术。您无需费心解码视频格式和内容。这将由 Windows 为您完成。您可以访问视频帧数据、搜索视频、编码视频等。

标签: c# performance video ffmpeg


【解决方案1】:

我认为问题不在于 FFmpeg,而在于 Accord 包装器进行搜索。我建议直接在单遍中使用 ffmpeg 来提取帧,因为它可以选择仅提取关键帧或每个 X 帧(或者您可以只使用嵌入的视频时间戳......)。但是如果你想继续你的路径,那么可以考虑passing the desired frame index 而不是 for 循环 - 它应该更快,也许你可以并行化它。

但是在一个单独的 ffmpeg 进程中完成这一切会快得多

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 2020-08-26
    • 2021-10-28
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多