c# - 在 C# 中处理视频帧(FFMPEG 慢)

标签 c# performance video ffmpeg

我正在尝试从 mp4 视频中提取帧以进行处理。
即视频图像中有一个水印/时间戳,我想用它来自动将视频拼接在一起。视频创建日期不足以完成此任务。
enter image description here
使用 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 帧(或者您可以只使用嵌入的视频时间戳......)。但是如果你想继续你的道路,那么可以考虑passing the desired frame index而不是 for 循环 - 它应该更快,也许你可以并行化它。
但它会是 很多在单独的 ffmpeg 进程中更快地完成这一切。

关于c# - 在 C# 中处理视频帧(FFMPEG 慢),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63806925/

相关文章:

Java 无法及时收集垃圾

loops - mp4 Vj 动画视频滞后于高分辨率视频

video - 使用 Homebrew 安装较旧的 FFmpeg 版本

c# - MVC4 根据用户选择动态更改表单的操作

c# - 具有向后导航的流畅接口(interface)(方法链接)

c# - 初始化一个集合,这样用户就不必

c# - MEF - 从其他 View 显示 View

php - 使用 Asterisk PHP 脚本匹配电话前缀的最快方法

python将视频转换为音频

sql - 在 latin1 中查询速度快,在 utf8 中查询速度慢 - 为什么?