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

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

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

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

您可以以编程方式执行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); } 

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

 var ffMpeg = new NReco.VideoConverter.FFMpegConverter(); ffMpeg.GetVideoThumbnail(pathToVideoFile, thumbJpegStream,5); 

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

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

它需要像其他答案一样的FFmpeg可执行文件,但你可以下载它

  FFmpeg.GetLatestVersion(); 

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

  [HttpPost] [Route("UploadImages")] public HttpResponseMessage Post() { HttpResponseMessage response = new HttpResponseMessage(); var httpRequest = HttpContext.Current.Request; if (httpRequest.Files.Count > 0) { var docfiles = new List(); foreach (string file in httpRequest.Files) { var postedFile = httpRequest.Files[file]; var filePath1 = HttpContext.Current.Server.MapPath("~/ImgFolder/" + postedFile.FileName); Stream strm = postedFile.InputStream; CreateThumbnail(strm, postedFile.FileName); Compressimage(strm, filePath1, postedFile.FileName); } response = Request.CreateResponse(HttpStatusCode.Created, docfiles); } else { response = Request.CreateResponse(HttpStatusCode.BadRequest); } return response; } public static void **CreateThumbnail**(Stream sourcePath, string filename) { Image image = Image.FromStream(sourcePath); Image thumb = image.GetThumbnailImage(120, 120, () => false, IntPtr.Zero); var filePath1 = HttpContext.Current.Server.MapPath("~/Thumbnail/" + filename); thumb.Save(filePath1 + filename); } public static void Compressimage(Stream sourcePath, string targetPath, String filename) { try { using (var image = Image.FromStream(sourcePath)) { float maxHeight = 900.0f; float maxWidth = 900.0f; int newWidth; int newHeight; string extension; Bitmap originalBMP = new Bitmap(sourcePath); int originalWidth = originalBMP.Width; int originalHeight = originalBMP.Height; if (originalWidth > maxWidth || originalHeight > maxHeight) { // To preserve the aspect ratio float ratioX = (float)maxWidth / (float)originalWidth; float ratioY = (float)maxHeight / (float)originalHeight; float ratio = Math.Min(ratioX, ratioY); newWidth = (int)(originalWidth * ratio); newHeight = (int)(originalHeight * ratio); } else { newWidth = (int)originalWidth; newHeight = (int)originalHeight; } Bitmap bitMAP1 = new Bitmap(originalBMP, newWidth, newHeight); Graphics imgGraph = Graphics.FromImage(bitMAP1); extension = Path.GetExtension(targetPath); if (extension == ".png" || extension == ".gif") { imgGraph.SmoothingMode = SmoothingMode.AntiAlias; imgGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; imgGraph.DrawImage(originalBMP, 0, 0, newWidth, newHeight); bitMAP1.Save(targetPath, image.RawFormat); bitMAP1.Dispose(); imgGraph.Dispose(); originalBMP.Dispose(); } else if (extension == ".jpg") { imgGraph.SmoothingMode = SmoothingMode.AntiAlias; imgGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; imgGraph.DrawImage(originalBMP, 0, 0, newWidth, newHeight); ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg); Encoder myEncoder = Encoder.Quality; EncoderParameters myEncoderParameters = new EncoderParameters(1); EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L); myEncoderParameters.Param[0] = myEncoderParameter; bitMAP1.Save(targetPath, jpgEncoder, myEncoderParameters); bitMAP1.Dispose(); imgGraph.Dispose(); originalBMP.Dispose(); } } } catch (Exception) { throw; } } public static ImageCodecInfo GetEncoder(ImageFormat format) { ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); foreach (ImageCodecInfo codec in codecs) { if (codec.FormatID == format.Guid) { return codec; } } return null; }