在C#中获取视频文件的缩略图

mee*_*eer 32 .net c#

我想显示我网站上列出的视频的缩略图,我想从视频中获取单帧(从特定时间开始)并将其显示为缩略图.

我试过这个http://ramcrishna.blogspot.com/2008/09/playing-videos-like-youtube-and.html但是没有用.

这可能是使用.NET C#吗?

Vit*_*nko 60

FFMpeg是一个正确的工具,可用于在某个位置提取视频帧.您可以如上所述调用ffmpeg.exe,或者只使用现有的.NET包装器(如.NET转换器(免费),只需一行代码即可获得缩略图:

var ffMpeg = new NReco.VideoConverter.FFMpegConverter();
ffMpeg.GetVideoThumbnail(pathToVideoFile, thumbJpegStream,5);
Run Code Online (Sandbox Code Playgroud)

  • 你安装了错误的包裹.右边的是"Install-Package NReco.VideoConverter"(NReco.Application.Web是关于ASP.NET应用程序的NReco框架). (3认同)
  • 可以用来获取特定尺寸的缩略图吗?因为我正在获取图像,但它是默认尺寸,即426x240,我需要720x360 (2认同)
  • @AkshayHazari你可以使用ConvertMedia方法转换为1帧mjpeg输出(这就是GetVideoThumbnail的实际操作方式).不过,最好为GetVideoThumbnail添加额外的选项,感谢您注意到这一点. (2认同)

mar*_*d13 16

您可以以编程方式执行FFmpeg以生成缩略图图像文件.然后打开图像文件以便随意使用它.

以下是一些示例代码:

public static Bitmap GetThumbnail(string video, string thumbnail)
{
    var cmd = "ffmpeg  -itsoffset -1  -i " + '"' + video + '"' + " -vcodec mjpeg -vframes 1 -an -f rawvideo -s 320x240 " + '"' + thumbnail + '"';

    var startInfo = new ProcessStartInfo
    {
        WindowStyle = ProcessWindowStyle.Hidden,
        FileName = "cmd.exe",
        Arguments = "/C " + cmd
    };

    var process = new Process
    {
        StartInfo = startInfo
    };

    process.Start();
    process.WaitForExit(5000);

    return LoadImage(thumbnail);
}

static Bitmap LoadImage(string path)
{
    var ms = new MemoryStream(File.ReadAllBytes(path));
    return (Bitmap)Image.FromStream(ms);
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么`WaitForExit(5000)`? (2认同)

小智 6

Xabe.FFmpeg-免费,开源和跨平台库。为FFmpeg提供流畅的API。从Xabe.F中的视频生成缩略图

    string output = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + FileExtensions.Png);
    IConversionResult result = await Conversion.Snapshot(Resources.Mp4WithAudio, output, TimeSpan.FromSeconds(0))
                                               .Start();
Run Code Online (Sandbox Code Playgroud)

像其他答案一样,它需要FFmpeg可执行文件,但是您可以通过以下方式下载它

    FFmpeg.GetLatestVersion();
Run Code Online (Sandbox Code Playgroud)

此处提供完整文档-Xabe.FFmpeg文档

  • 只需留下注释,该库可免费用于非商业用途。 (2认同)

Ken*_*Ken 6

因为人们不想在商业软件中使用 FFMpeg 作为它的麻烦。我这里有一个旧的解决方案:

ShellFile shellFile = ShellFile.FromFilePath(VideoFileName);
Bitmap bm = shellFile.Thumbnail.Bitmap;
Run Code Online (Sandbox Code Playgroud)

然后你会得到一个可以用于绘图的 Bitmap 对象。如果你想要一个文件,只需执行以下操作:

bm.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
Run Code Online (Sandbox Code Playgroud)

如果您想要一个可以在 Xaml 绑定中使用它的 BitmapImage。只需将 Bitmap 传输到 BitmapImage。下面是一个例子:

public static BitmapImage ConvertBitmapToBitmapImage(Bitmap bitmap)
        {
            MemoryStream ms = new MemoryStream();
            bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            ms.Seek(0, SeekOrigin.Begin);
            image.StreamSource = ms;
            image.EndInit();

            return image;
        }
Run Code Online (Sandbox Code Playgroud)

  • 这与 FFMpeg 解决方案不同。您确实需要为此安装 Nuget 包 (WindowsAPICodePack-Shell)。 (6认同)