如何在 .Net 中获取视频缩略图?

28

我想实现一个函数,从输入视频中获取单个帧,以便用作缩略图。

以下类似的方法应该是可行的:

// filename examples: "test.avi", "test.dvr-ms"
// position is from 0 to 100 percent (0.0 to 1.0)
// returns a bitmap
byte[] GetVideoThumbnail(string filename, float position)
{
}

有人知道如何在 .Net 3.0 中实现这个吗?

正确的解决方案将是该函数的“最佳”实现。如果避免选择空白帧,则会获得额外加分。


有完整的源代码示例吗? - Kiquenet
虽然这个问题是先被问到的,但是这个可能是重复问题的答案对我更有用。 - Weihui Guo
5个回答

10

我最终自己编写了一个独立的类(具有我描述的单个方法),源代码可以在这里查看媒体浏览器是GPL,但我很乐意将我为该文件编写的代码放入公共领域。请注意,它使用了directshow.net项目的互操作性,因此您将需要与他们清除代码的那一部分。

对于DVR-MS文件,这个类将无法工作,您需要为这些文件注入一个DirectShow过滤器。


嗨 - 这真的很有用,谢谢!但是我在没有任何实际错误的情况下遇到了一些问题。对于不支持的WMV文件,我从IMediaDet.get_OutputStreams()调用中获取一个outputstream,但是IMediaDet.WriteBitmapBits()却什么都没做。 然而对于AVI文件,IMediaDet.get_OutputStreams()调用没有返回任何内容,因此该方法什么也不做就直接返回了。 我已经排除了基本的文件I/O问题和权限等(同一应用程序上传视频,并且还为某些格式获取了outputstream)。 您可能有的任何指针/建议将非常棒! - user369142
个人而言,我现在会看看ffdshow,因为微软的DirectShow接口非常不稳定。 - Sam Saffron
2
@SamSaffron,您有关于2015年如何处理这个问题的建议吗?由于我在Nuget上找不到MediaBrowser库,所以无法测试您的代码片段。 - M H

7

5

1- 从http://ffmpeg.arrozcru.org/builds/获取最新版本的ffmpeg.exe。

2- 解压文件并将ffmpeg.exe复制到您的网站上。

3- 使用以下代码:

Process ffmpeg;

string video;
string thumb;

video = Server.MapPath("first.avi");
thumb = Server.MapPath("frame.jpg");

ffmpeg = new Process();

ffmpeg.StartInfo.Arguments = " -i "+video+" -ss 00:00:07 -vframes 1 -f image2 -vcodec mjpeg "+thumb;
ffmpeg.StartInfo.FileName = Server.MapPath("ffmpeg.exe");
ffmpeg.Start();

更易于在cmd中使用:ffmpeg.exe -i "文件名.mp4" -ss 00:00:02 -vframes 1 -f image2 -vcodec mjpeg frame.jpg - Gennady G
1
这个答案太棒了。ffmpeg 为每个平台提供二进制文件,并支持几乎世界上的所有编解码器。其他答案依赖于平台,支持的编解码器有限。感谢 Ahmad。 - Emad


0

www.mitov.com上有一些库可能会有所帮助。它是Directshow功能的通用包装器,我认为其中一个演示展示了如何从视频文件中获取帧。


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