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

本文关键字:略图 文件 视频 获取 | 更新日期: 2023-09-27 18:06:23

我想为我的网站上列出的视频显示缩略图,我想从一个视频(从一个特定的时间)中获取一个帧,并将它们显示为缩略图

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

可以使用。net c#吗?

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

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

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

您可以通过编程方式执行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的人来说,它的麻烦。我有一个老方法:

ShellFile shellFile = ShellFile.FromFilePath(VideoFileName);
Bitmap bm = shellFile.Thumbnail.Bitmap;

然后你会得到一个位图对象,可以在绘图中使用。如果需要一个文件,只需执行:

bm.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
如果你想要一个BitmapImage,你可以在Xaml绑定中使用它。只需将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;
        }

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();

像其他答案一样需要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<string>();
                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;  
        }