详解C#如何实现分割视频
作者:Csharp小记 发布时间:2022-12-07 10:48:23
标签: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掉了,这个方式可能不太规范,如有更好的方法,感谢指教。
调用的话就直接输入命令就可以了,代码中分别使用了以下两条命令:
获取第一秒的图片作为封面图显示到了图片控件中
将视频分割成一张张图片并保存到了文件夹中
来源:https://mp.weixin.qq.com/s/goB1FHQ-FRRhRYRjOkOZTw


猜你喜欢
- 1|1简介最近基于最新的Activiti7配置了SpringBoot2。简单上手使用了一番。发现市面上解决Activiti7的教程很少,采坑
- 本文实例讲述了C#通过链表实现队列的方法。分享给大家供大家参考。具体实现方法如下:public class Node{ public int
- Java对象内存构成今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synch
- 前言本文主要给大家介绍了关于C#基础之Attribute和反射的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。A
- 一. 编写.cs文件注:要想编译dll中注释可用,则代码中的注释要用“ /// ” 来进行注释,否则
- 意图:想将项目用到的两个dll库文件(CryptEnDe.dll和ICSharpCode.SharpZipLib.dll)一同编译进exe中
- AOP概念的引入传统的登录原理:如上图所示这是一个基本的登录原理图,但是如果我们想要在这个登录之上添加一些新的功能,比如权限校验那么我们能想
- 给对象按照字符串属性进行排序在java中对象进行排序,排序的属性是string,我们只需要实现Comparator接口,然后实现比较的方式。
- 这几年一直在做手机上和电视盒的App,几乎没有考虑过横竖屏切换的问题。电视盒好说,横屏不变,你要是给它设计个竖屏人家也没机会使;而手机上的应
- 本文通俗易懂的分析了C#中值类型和引用类型的区别。分享给大家供大家参考。具体分析如下:似乎“值类型和引用类型的区别”是今年面试的流行趋势,我
- 简介简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。简单工厂模式通常是定
- 前言2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化。在修改之前,我的说法是这样的:就像鲸鱼吃虾米一样,也许
- 本文实例讲述了Android编程实现google消息通知功能。分享给大家供大家参考,具体如下:1. 定义一个派生于WakefulBroadc
- 一、JSON格式介绍JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相对于另一种数据交换格式
- 1.准备工作1、新建一个SpringBoot项目加上web依赖, 所有依赖<dependency><groupId>
- Spring Security 基本介绍这里就不对Spring Security进行过多的介绍了,具体的可以参考官方文档我就只说下Sprin
- 简介:本文已一个简要的代码示例介绍ThreadLocal类的基本使用方式,在此基础上结合图片阐述它的内部工作原理。早在JDK1.2的版本中就
- 下面给大家介绍C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能,具体代码如下所示:using Syst
- Android Studio第一次启动的Fetching android sdk component information的问题1)进入刚
- Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager