C#实现视频的批量剪辑功能
作者:xchenbb 发布时间:2023-07-15 06:18:30
标签:C#,视频,剪辑
篇首,完全没有技术含量的帖子,高手略过,只为十几年后重新捡起的我爱好玩玩。。。
起因,一个朋友说他下载了很多短视频,但只需要要其中的一小截,去头掐尾,在软件里搞来搞去太麻烦,让我帮忙,我这个编程二吊子爽快的接了下来。
还是一二三理清思路,方案就用ffmpeg,命令行剪辑生成新视频,c#做个集成一键处理。。
一,采用预置数据data.txt,记录【视频文件名,起点时间,终止时间】,此为单独一行,多个文件就多行,如下图
二,一个videocut类
class VideoCut
{
public string file;
public string begin;
public string end;
public VideoCut(string f,string b,string w)
{
file = f;
begin = b;
end = w;
}
}
三,解析数据文件data.txt,生成videocut的列表
count = 0;
listbox.Items.Clear();
logno("开始解析数据文件....");
if (!System.IO.File.Exists("data.txt"))
{
log("找不到数据文件data.txt");
return;
}
List<VideoCut> list = new List<VideoCut>();
string[] ary;
TimeSpan begin;
TimeSpan end;
int i = 0;
foreach (string line in System.IO.File.ReadLines("data.txt"))
{
ary = line.Trim().Split(',');
log("第" + ++i + "行:" + line.Trim());
if(ary.Length!=3)
{
log("数据:"+line.Trim()+",格式不对");
continue;
}
if (!System.IO.File.Exists(ary[0]))
{
log("文件:"+ary[0].Trim()+",不存在");
continue;
}
if (!TimeSpan.TryParse(ary[1].Trim(), out begin))
{
log("起点时间:" + ary[1].Trim() + ",格式不对");
continue;
}
if (!TimeSpan.TryParse(ary[2].Trim(), out end))
{
log("截止时间:" + ary[2].Trim() + ",格式不对");
continue;
}
if (end <= begin)
{
log("截止时间应该大于起点时间!!!!!");
continue;
}
list.Add(new VideoCut(ary[0], ary[1], (end-begin).ToString()));
}
logno("解析数据文件完毕,成功解析文件:"+list.Count+"个...");
if (list.Count < 1)
{
log("没有数据,退出");
}
四,一个ffmpeg的剪辑类
class FFMEPG
{
//视频切割
public static string Cut(string OriginFile/*视频源文件*/, string startTime/*开始时间*/, string endTime/*结束时间*/)
{
string DstFile = OriginFile.Replace(".", "a.");
string strCmd = " -ss "+ startTime
+" -i " + OriginFile
+ " -to " +endTime
+ " -vcodec copy -acodec copy " + DstFile + " -y ";
if (System.IO.File.Exists(DstFile))System.IO.File.Delete(DstFile);
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "ffmpeg.exe";//要执行的程序名称
p.StartInfo.Arguments = " " + strCmd;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = false;//可能接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息
p.StartInfo.RedirectStandardError = false;//重定向标准错误输出
p.StartInfo.CreateNoWindow = false;//不显示程序窗口
p.Start();//启动程序
p.WaitForExit();//等待程序执行完退出进程
if (System.IO.File.Exists(DstFile))
{
return DstFile;
}
return "";
}
}
五,循环调用videocut列表
VideoCut c;
string file;
for (i = 0; i < list.Count; i++)
{
logno("开始剪切第【" +i + "】个文件...");
c=list[i];
file = FFMEPG.Cut(c.file, c.begin, c.end);
if (file.Length > 0)
{
log("剪切成功,输出文件:"+file);
}
else log("剪切失败.....");
}
log("");
log("");
log("剪切完成......");
六,大致就这样了,运行如下图
ffmpeg命令要能够调用哈,放到同目录或都windows系统目录都行。。。
源代码已经上传,可以下载到。。。
来源:https://blog.csdn.net/xchenbb/article/details/129697765
0
投稿
猜你喜欢
- 项目最终的文件结构1 添加maven依赖 <dependency> <groupI
- 如题,记录一些平常开发用的pom文件细节1.使用parent父类引用,解决依赖版本号不确定时自动匹配的问题<parent> &n
- 文件切割和文件合并这个问题困扰了我有一段时间了(超过一天没做粗来)。找了好多博客,本来想转载一个来的 结果找不到了。很无奈。只好自己贴代码上
- 1. 服务端配置java启动命令增加以下参数即可:-Dcom.sun.management.jmxremote \-Dcom.sun.man
- 本文实例为大家分享了Android Webview使用小结,供大家参考,具体内容如下#采用重载URL的方式实现Java与Js交互在Andro
- 目录一、复习二、两者对比三、在什么情况下才会使用volatile四、Java中的原子性操作五、Java中的CAS操作六、ABA问题七、Uns
- 在我们开发SpringBoot后端服务时,一般需要给前端统一响应格式,方便前端调试及配置错误提示等等。这篇文章讲讲实际工作中统一响应格式及统
- 项目初始流程:首先说一下pom.xml文件的依赖: <dependencies><!-- junit 测试 -->
- clone() 方法麻烦一些,需要将所有涉及到的类实现声明式接口 Cloneable,并覆盖Object类中的clone()方法,并设置作用
- 目录LinkedHashMap 实现继承 LinkedHashMap组合 LinkedHashMap链表 + HashMap 实现LRU,即
- Spring Cloud Gateway去掉url前缀主要是增加一个 route,其他配置不变routes: - id: ser
- 一、月份英文简写DateTime dt = DateTime.Now;string MM = dt.AddMonths(-1).ToStri
- 代码public class LamdaDemo{ public static void main( String[] args
- 使用了Android的系统API实现了多点触控功能,多点触控对设备的硬件有一定的要求,目前市面上的手机几乎都能实现多点触控了。实现多点触控最
- 在开发的过程中,往往会需要在组件中添加一些按钮,用于执行一些自定义的操作。例如你有一个组件A,里面有一个List<Collider&g
- 由于项目需要做一些图形展示,所以就想到了使用Directx和OpenGL来绘图,但项目准备使用C#来开发(大家比较熟悉C#),在网上看了相关
- 这篇文章主要介绍了Spring Bean初始化及销毁多种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- zookeeper集群配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的数据是相同的,每一个服务器均可以对外提供读
- 从何说起前些天和朋友讨论一个问题,他们的应用有几十万会员然后对应有积分,现在想做积分排名的需求,问有没有什么好方案。这个问题也算常见,很多地
- JVM内部结构图Java虚拟机主要分为五个区域:方法区、堆、Java栈、PC寄存器、本地方法栈。下面来看一些关于JVM结构的重要问题。1.哪