用C#处理视频帧(FFMPEG慢速)

用C#处理视频帧(FFMPEG慢速),c#,performance,video,ffmpeg,C#,Performance,Video,Ffmpeg,我正在尝试从mp4视频中提取帧,以便对其进行处理 也就是说,在视频图像中有一个水印/时间戳,我想用它将视频自动缝合在一起。视频创建日期不足以执行此任务。 此外,使用AI从视频中提取文本的部分也很好 然而,FFMPEG似乎非常慢。源视频为1080p/60fps(大约每5分钟视频1GB) 到目前为止,我使用Accord.FFMPEG包装器尝试了两种方法: public void GetVideoFrames(string path) { using (var vFReader = new

我正在尝试从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
            }
        }
    }
}
public void GetVideoFrames(字符串路径)
{
使用(var vfreeader=new VideoFileReader())
{
//打开视频文件
vfreeader.Open(路径);
//计数器用于提取每第X帧(每秒1帧)
int计数器=0;
对于(int i=0;i如果(counter我认为问题不在于FFmpeg,而在于Accord包装器进行搜索。我建议在一次过程中直接使用FFmpeg来提取帧,因为它可以选择仅提取关键帧或每X帧(或者只使用嵌入的视频时间戳…)但是,如果你想继续你的路径,那么不妨考虑一下,而不是一个循环——它应该更快,也许你可以对它进行类比。

但是在一个单独的ffmpeg过程中完成这一切要快得多。

你不是把每一帧都当作一幅图像吗?你为什么期望它快呢?当你说把视频缝合在一起时,你的确切意思是什么?不。方法1(更快)确实在拉取每一帧,并转储其中的大部分。当然它非常慢。这就是为什么我首先使用方法2,期望ffmpeg从流中最后一个已知的位置进行搜索。但是显然,它每次都从位置0进行搜索。所以方法2(应该)不是每一帧都拉,但它的速度要慢一些。好吧,同步后你会并排渲染它们吗?几年前,我使用DirectShow(用C++编写的自定义过滤器)实现了这样的功能这是非常快的。如果你需要性能,我想你应该切换到原生。你可以使用DirectShow或媒体基金会。这是Windows的本地技术。你不必费解解码视频格式和东西。这将由Windows为你完成。你可以访问视频帧数据,搜索你的视频,编码。视频返回等。
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
}