详解C#如何实现分割视频

 更新时间:2022年12月29日 08:58:01   作者:Csharp小记  
这篇文章主要为大家详细介绍了C#如何实现将视频文件分割成一帧帧图片的方法,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下

文章描述

在前面两篇写完了对于GIF动态图片的分割和合成,这一篇来写下将视频文件分割成一帧帧图片的方法。

开发环境

.NET Framework版本:4.5

开发工具

Visual Studio 2013

实现代码

public static void Run(string cmd)
        {
            try
            {
                string ffmpeg = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg.exe";
                ProcessStartInfo startInfo = new ProcessStartInfo(ffmpeg);
                startInfo.UseShellExecute = false;
                startInfo.CreateNoWindow = true;
                startInfo.WindowStyle = ProcessWindowStyle.Hidden;
                startInfo.Arguments = cmd;
                Process process = Process.Start(startInfo);
                process.WaitForExit(5000);
                process.Kill();
            }
            catch { }
        }

        /// <summary>
        /// 分割视频
        /// </summary>
        /// <param name="videoPath">视频路径</param>
        /// <param name="outPath">输出图片路径</param>
        public static void Split(string videoPath, string outPath)
        {
            Run(string.Format(" -i {0}  -r 10 -y -f image2 -ss 00:00:01 {1}\\%d.jpg", videoPath, outPath));
        }

        /// <summary>
        /// 按时间获取某帧图片
        /// </summary>
        /// <param name="videoPath">视频路径</param>
        /// <param name="outPath">输出图片路径</param>
        /// <param name="frameTime">时间(格式:00:00:01)</param>
        public static void GetFrame(string videoPath, string outPath, string frameTime)
        {
            Run(string.Format("-ss 00:00:01 -i {1} {2}", frameTime, videoPath, outPath));
        }
private void btn_select_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "视频|*.mp4;*.avi";
            ofd.Title = "请选择视频文件";
            ofd.InitialDirectory = Application.StartupPath;
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                axWindowsMediaPlayer1.URL = ofd.FileName;
                string outPath = Application.StartupPath + "\\cover.jpg";
                FFmpegUtil.GetFrame(ofd.FileName, outPath, "00:00:01");
                pictureBox1.Image = Image.FromFile(outPath);
            }
        }

        private void btn_split_Click(object sender, EventArgs e)
        {
            if(!File.Exists(axWindowsMediaPlayer1.URL)){
                MessageBox.Show("未选择视频");
                return;
            }
            FolderBrowserDialog fbd = new FolderBrowserDialog();
            fbd.Description = "选择存储位置";
            fbd.ShowNewFolderButton = true;
           if (fbd.ShowDialog() == DialogResult.OK)
            {
                string[] files = Directory.GetFiles(fbd.SelectedPath);
                foreach (string file in files)
                {
                    File.Delete(file);
                }
                FFmpegUtil.Split(axWindowsMediaPlayer1.URL, fbd.SelectedPath);
                if (MessageBox.Show("视频分割完成,是否打开文件夹?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    Process.Start(fbd.SelectedPath);
                }
            }

        }

实现效果

代码解析:视频分割技术主要是利用了FFMpeg来实现的,C#在这里其实只是一个调用者。这个在方法Run中可以看的出来,首先是需要将FFMpeg放到debug目录下的,然后使用Process类来调用;这里有个问题需要注意下,就是调用后经常会被卡住,没办法退出来,所以使用了WaitForExit(2000)来处理。并且在等待结束后将该进程给Kill掉了,这个方式可能不太规范,如有更好的方法,感谢指教。

调用的话就直接输入命令就可以了,代码中分别使用了以下两条命令:

  • 获取第一秒的图片作为封面图显示到了图片控件中
  • 将视频分割成一张张图片并保存到了文件夹中

到此这篇关于详解C#如何实现分割视频的文章就介绍到这了,更多相关C#分割视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • WinForm绘制圆角的方法

    WinForm绘制圆角的方法

    这篇文章主要介绍了WinForm绘制圆角的方法,涉及C#中GraphicsPath模块的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 解析C#设计模式编程中备忘录模式的运用

    解析C#设计模式编程中备忘录模式的运用

    这篇文章主要介绍了C#设计模式编程中备忘录模式的运用,备忘录模式用来保存与对象有关的数据用以在将来对对象进行复原,需要的朋友可以参考下
    2016-02-02
  • C#调用百度翻译API实现一个翻译功能

    C#调用百度翻译API实现一个翻译功能

    一直喜欢用Google Translate API进行在线翻译,但是服务越来越慢这篇文章,所以只能换一个了,主要给大家介绍了关于C#调用百度翻译API实现一个翻译功能的相关资料,需要的朋友可以参考下
    2021-06-06
  • WPF应用启动慢的问题解决

    WPF应用启动慢的问题解决

    今天碰到一个奇怪的现象,在某些机器上,进行了系统还原后,WPF应用打开较慢,约有35s。本文先记录下该问题的解决方案,应用启动性能官方文档中有说明,还有搜到的其它方案没来得及测试,如NGEN update
    2021-05-05
  • asp.net新闻列表生成静态页之批量和单页生成

    asp.net新闻列表生成静态页之批量和单页生成

    web程序的高访问量、大数据量、高效的用户体验度,使静态页技术在越来越多的网站上发挥作用。这篇文章主要介绍asp.net新闻列表生成静态页之批量和单页生成,有需要的朋友可以参考下
    2015-08-08
  • C#实现Excel与DataTable的数据互转的代码示例

    C#实现Excel与DataTable的数据互转的代码示例

    在.NET框架中,使用C#进行Excel数据与DataTable之间的转换是数据分析、报表生成、数据迁移等操作中的常见需求,这一过程涉及到将Excel文件中的数据读取并加载至DataTable中,本文将介绍如何通过C#语言实现Excel数据与DataTable之间的高效转换,需要的朋友可以参考下
    2024-11-11
  • 详解如何使用BenchmarkDotNet对.NET代码进行性能基准测试

    详解如何使用BenchmarkDotNet对.NET代码进行性能基准测试

    BenchmarkDotNet是一个基于.NET开源、功能全面、易于使用的性能基准测试框架,这篇文章就来和小编一起学习一下如何使用BenchmarkDotNet对.NET代码进行性能基准测试吧
    2024-12-12
  • c# Task任务的取消方式

    c# Task任务的取消方式

    文章介绍了如何在C#中使用CancellationTokenSource和CancellationToken来取消任务,通过Task.Run方法和CancellationToken参数,可以控制任务的执行,并在需要时取消它们,文章还讨论了CancellationToken参数的重要性
    2024-12-12
  • C#中嵌入SQLite数据库的简单方法

    C#中嵌入SQLite数据库的简单方法

    本文给大家介绍的是C#中嵌入SQLite数据库的简单方法,十分的方便也很实用,有需要的小伙伴可以参考下。
    2015-06-06
  • C#中的那些常用加密算法

    C#中的那些常用加密算法

    本文主要讲解一下C#常用的那些加密算法,包括MD5加密、SHA1加密、Base64加密、Des加密、RSA加密等,需要的朋友可以参考下
    2020-11-11

最新评论