如何将视频的第一帧保存为图像?

10

我希望能够从上传的视频中提取第一帧并保存为图像文件。
可能的视频格式包括mpeg,avi和wmv。

还有一点需要考虑,那就是我们正在创建一个ASP.NET网站。


3
任何视频的第一帧通常是黑色的。你最好检查几个帧并选择最大的一个(字节大小)。这实际上是对“最有趣的帧”的一个很好的近似,特别是在从黑色淡入的情况下。 - Ian Mercer
3个回答

8

您可以将FFMPEG作为单独的进程(最简单的方法)使用,并让它先为您解码第一个IDR。这里有一个名为FFMPEG的类,它具有GetThumbnail()方法,您可以向其中传递视频文件地址、要生成的JPEG图像地址和所需的分辨率:

using System.Diagnostics;
using System.Threading; 

public class FFMPEG
{
    Process ffmpeg;

    public void exec(string input, string output, string parametri)
    {
        ffmpeg = new Process();

        ffmpeg.StartInfo.Arguments = " -i " + input+ (parametri != null? " "+parametri:"")+" "+output; 
        ffmpeg.StartInfo.FileName = "utils/ffmpeg.exe";
        ffmpeg.StartInfo.UseShellExecute = false;
        ffmpeg.StartInfo.RedirectStandardOutput = true;
        ffmpeg.StartInfo.RedirectStandardError = true;
        ffmpeg.StartInfo.CreateNoWindow = true;

        ffmpeg.Start();
        ffmpeg.WaitForExit();
        ffmpeg.Close();     
    }


    public void GetThumbnail(string video, string jpg, string velicina)
    {
        if (velicina == null) velicina = "640x480";
        exec(video, jpg, "-s "+velicina);
    }
}

使用方法如下:

FFMPEG f = new FFMPEG();
f.GetThumbnail("videos/myvid.wmv", "images/thumb.jpg", "1200x223");

为了使其正常工作,您必须在/utils文件夹中拥有ffmpeg.exe,或更改代码以定位ffmpeg.exe。
还有其他使用.NET中的FFMPEG的方法,例如.NET包装器,您可以通过谷歌搜索找到它们。它们基本上在这里做相同的事情,只是更好。因此,如果FFMPEG可以完成您的工作,我建议使用.NET包装器。

如何从文件中间获取一个帧? - Entity
1
参数类似于 -ss 00:00:01.00。 - rogerdpack
我已经创建了缩略图,但是如何将其保存到我的文件夹中? - gsiradze

3

尝试将参数字符串格式化为以下形式:

ffmpeg.StartInfo.Arguments =" -i c:\MyPath\MyVideo -vframes 1 c:\MyOutputPath\MyImage%d.jpg"

与其

ffmpeg.StartInfo.Arguments = " -i " + input+ (parametri != null? " "+parametri:"")+" "+output;

在上面提供的答案代码中。

我不知道原因是什么,但是第二个提到的参数行在我的机器上不起作用,而当我像第一个命令一样更改参数时,它就可以正常工作。


0

在编程中处理视频最好的工具可能是FFMpeg。它支持许多格式,甚至包括wmv。我猜想甚至有一个.net封装


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接