C# WPF 获取视频的第一帧的两种方式

C# WPF 获取视频的第一帧的两种方式

方式一:调用ffmpeg

在WPF中调用FFmpeg获取视频封面,你可以使用FFmpeg的命令行接口。以下是一个简单的例子,展示了如何在C#代码中调用FFmpeg来提取视频封面(首帧)并将其显示在WPF应用程序中。

首先,确保你已经安装了FFmpeg。可以从官网下载并添加到系统的环境变量中,这样就可以在命令行中直接调用ffmpeg命令。

接下来,在你的WPF项目中,你可以使用Process类来执行FFmpeg命令。以下是一个简单的WPF窗口,它包含一个Image控件来显示提取出的封面。

/// <summary>
/// 导出封面图
/// </summary>
/// <param name="ffmpegFileName">FFmpeg.exe路径</param>
/// <param name="videoFileName">视频文件路径</param>
/// <returns>封面图</returns>
public static async Task<BitmapImage> GetVideoFace(string videoFileName)
{
    var ffmpeg = Directory.GetCurrentDirectory() + "\\ffmpeg.exe";
    //startInfo.Arguments = " -i " + srcName + " -y -f image2 -ss " + cutTimeFrame + " -t 0.001 -s " + widthAndHeight + " " + objName;

    string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(videoFileName);
    string baseDirectory = Directory.GetCurrentDirectory();
    if (!Directory.Exists(baseDirectory)) Directory.CreateDirectory(baseDirectory);
    string thumbFileName = Path.Combine(baseDirectory, fileNameWithoutExtension + ".jpg");
    ProcessStartInfo processStartInfo = new ProcessStartInfo(ffmpeg);
    processStartInfo.UseShellExecute = false;
    processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    processStartInfo.CreateNoWindow = true;
    processStartInfo.ErrorDialog = false;
    processStartInfo.RedirectStandardError = true;
    processStartInfo.Arguments = string.Format("-i \"{0}\" -y -f image2 -ss 1 \"{1}\"", new object[]
    {
        videoFileName,
        thumbFileName
    });// 第1帧
    Process.Start(processStartInfo).WaitForExit(100); ;  //Process.Start(processStartInfo).WaitForExit(500);
    BitmapImage bitmap = await SetImage(thumbFileName);

    return bitmap;
}

方式二:基于OpenCVSharp对视频进行帧提取

要使用OpenCvSharp在WPF中获取视频封面,你需要首先安装OpenCvSharp包,然后使用VideoCapture类来读取视频,并使用Mat类来获取帧。以下是一个简单的示例代码,展示了如何获取视频的第一帧作为封面:

/// <summary>
/// 取视频帧
/// </summary>
/// <param name="path">视频地址</param>
/// <returns></returns>
public static Task<BitmapImage> GetPicFromVideo(string path)
{
    return Task.Run(() =>
    {
        BitmapImage bitmapImage = new BitmapImage();
        using (var cap = new VideoCapture())
        {
            using (Mat image = new Mat())
            {
                if (cap.Open(path))//输入视频进行捕获
                {
                    bool state = true;
                    while (state)
                    {
                        cap.Read(image);//输出捕获帧
                        if (!image.Empty())
                        {
                            state = false;
                            using (Bitmap bitmap = image.ToBitmap())
                            {
                                //bitmapImage = ConvertBitmapToBitmapImage(bitmap);
                                using (MemoryStream memoryStream = new MemoryStream())
                                {
                                    // 将Bitmap保存到MemoryStream中
                                    bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
                                    // 从MemoryStream创建BitmapImage
                                    //BitmapImage bitmapImage = new BitmapImage();
                                    bitmapImage.BeginInit();
                                    bitmapImage.StreamSource = memoryStream;
                                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                                    bitmapImage.EndInit();
                                    bitmapImage.Freeze();
                                    bitmap.Dispose();
                                    return bitmapImage;
                                }
                            }
                        }
                    }
                }
            }
        }
        return bitmapImage;
    });            
}

完整工程文件

C# WPF获取视频封面的两种方式

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: C 是一种高级编程语言,广泛应用于软件开发和计算机科学领域。它由贝尔实验室的Dennis Ritchie在20世纪70年代开发。C语言以其简洁、高效和可移植的特性而受到广泛欢迎。 C语言具有许多特点。首先,C语言具有较低的级别,这意味着它与机器语言更接近,可以更好地控制硬件。其次,C语言使用了一种简洁优雅的语法,易于理解和学习。第三,C语言具有高度的可移植性,同一份代码可以在不同的操作系统和计算机体系结构上运行。最后,C语言提供了丰富的库函数,方便开发人员实现各种功能。 C语言广泛用于系统软件、应用软件和嵌入式系统开发。例如,操作系统、编译器、数据库和网络协议等底层软件通常使用C语言进行开发,因为它具有更高的性能和更好的控制能力。应用软件包括各种桌面应用程序和游戏,开发人员可以使用C语言的丰富库函数来简化开发过程。此外,C语言也常用于嵌入式系统开发,例如智能手机、汽车控制系统和家电等。 虽然C语言已经存在了几十年,但它仍然是一种非常有用的编程语言。许多现代编程语言都是在C语言的基础上发展而来的,因此理解并掌握好C语言对于进一步学习其他编程语言和深入理解计算机科学原理都是非常重要的。 ### 回答2: c是电子邮件通信中的一种协议,全称为“Internet Message Access Protocol”(互联网邮件访问协议)。它使用在客户端和邮件服务器之间,用于接收和管理邮件的通信。与其他邮件协议相比,如POP3,c协议具有更高级的功能和灵活性。 c协议支持在线和离线两种邮件访问模式。在线模式允许用户直接与邮件服务器进行实时通信,管理邮件并将其同步到多个设备上。离线模式将邮件存储在本地设备上,使用户能够离线浏览邮件并进行管理,当重新连上网络时会自动同步。 使用c协议,用户可以创建、删除、移动邮件夹,搜索和过滤邮件,标记已读或未读,以及设置自动回复等功能。用户可以通过客户端软件、移动设备上的邮件应用程序以及web界面来访问邮件服务器。 c协议还具有安全性方面的特性,如使用SSL/TLS加密传输、身份验证等,以确保邮件的机密性和完整性。 总的来说,c协议是一种高级的邮件访问协议,提供了丰富的邮件管理功能和灵活的访问方式,使用户能够方便地接收、查看和管理邮件。它在现代的电子邮件通信中得到广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值