Obtenir une image miniature du fichier vidéo en C #

Je souhaite afficher des vignettes pour les vidéos répertoriées sur mon site, je souhaite extraire une seule image d’une vidéo (d’une heure particulière) et les afficher sous forme de vignettes.

J’ai essayé ceci http://ramcrishna.blogspot.com/2008/09/playing-videos-like-youtube-and.html mais ne fonctionne pas.

Est-ce possible avec .NET C #?

Vous pouvez exécuter par programme FFmpeg pour générer un fichier image miniature. Ensuite, ouvrez le fichier image pour l’utiliser comme vous le souhaitez.

Voici un exemple de code:

public static Bitmap GetThumbnail(ssortingng video, ssortingng 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(ssortingng path) { var ms = new MemoryStream(File.ReadAllBytes(path)); return (Bitmap)Image.FromStream(ms); } 

FFMpeg est un bon outil qui peut être utilisé pour extraire une image vidéo à un endroit donné. Vous pouvez appeler ffmpeg.exe comme indiqué ci-dessus ou simplement utiliser un wrapper .NET existant (comme Video converter for .NET (gratuit) pour obtenir une vignette avec une seule ligne de code:

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

Xabe.FFmpeg – bibliothèque libre, open source et multiplate-forme. Fournit une API fluide à FFmpeg. Générer une vignette à partir d’une vidéo dans Xabe.F

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

Il nécessite des exécutables FFmpeg comme dans l’autre réponse mais vous pouvez le télécharger par

  FFmpeg.GetLatestVersion(); 

Documentation complète disponible ici – Documentation 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 (ssortingng 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, ssortingng 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, ssortingng targetPath, Ssortingng filename) { try { using (var image = Image.FromStream(sourcePath)) { float maxHeight = 900.0f; float maxWidth = 900.0f; int newWidth; int newHeight; ssortingng 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; }