在线视频文件合并
经常在浏览一些在线视频,是由大量分段视频组成,可以通过合并,并转换成mp4等格式。
- 方法一:使用软件合并,如格式工厂的视频合并:
注:由于格式工厂每次添加的文件数量上限是100个,当有大量分段文件时,该方法比较麻烦
- 方法二:使用命令行copy /B合并,根据测试,该方法可支持合并格式包括但不限于MP4,TS,M2TS的分段视频文件
步骤:
1.把视频文件放于同一文件夹内
2.视频文件的文件名需为序号.扩展名
例如 001.mp4 002.mp4 003.mp4 004.mp4 ......
序号不能错,否则合并的视频内容会出错
3.使用 cd /D 命令 切换到要第1步的文件夹(或者按住shift,右键第1步的文件夹打开命令窗口)
4.使用 copy /B 命令 合并文件
copy /B *.扩展名 合并后的文件名
例如:copy /B livestream000*.ts Merge.ts
5.测试合并后的视频文件能否正常播放,若能正常播放,则合并成功
- 方法三:通过编写代码合并,摘抄自网络的方法,未经过测试,其实使用的方法与方法二一样,使用copy /B分段合并
/// <summary> /// 批量合并ts视频文件 by GJW /// </summary> /// <param name="nameList">需要合并的视频地址集合</param> /// <param name="savePath">保存地址 物理地址</param> /// <param name="fileName">合成的文件名 需要添加拓展名.ts</param> public static void MergeVideoStatr(List<string> nameList, string savePath, string fileName) { //当次进行生成的文件名 存储合成文件名 List<string> Mergefile = new List<string>(); if (nameList.Count > 10) { int i = 0; foreach (var item in nameList) { //第二次之后合并 需要将合并好的视频放到最前面 if (Mergefile.Count == 0 && i == 1) Mergefile.Add(Path.Combine(savePath, fileName)); Mergefile.Add(item); //每10个文件合并一次 if (Mergefile.Count == 10) { if (i == 0) MergeVideo(Mergefile, savePath, fileName); else { MergeVideo(Mergefile, savePath, fileName); } //转换状态 下次添加新生成的初次合成的完成版文件 i = 1; //清除重新添加 Mergefile.Clear(); } } //清理剩下的文件 if (Mergefile.Count != 0 && i == 1) { MergeVideo(Mergefile, savePath, fileName); } } else { if (nameList.Count == 0) throw new Exception("合并视频数不能为0"); MergeVideo(nameList, savePath, fileName); } } /// <summary> /// 将某一文件夹下的ts文件 合并为一个完整版 BY GJW /// </summary> /// <param name="nameList">需要合并的视频地址集合</param> /// <param name="savePath">保存地址</param> /// <param name="fileNmae">合成的文件名</param> public static void MergeVideo(List<string> nameList,string savePath,string fileNmae) { if (nameList.Count == 0 || string.IsNullOrEmpty(savePath)) throw new Exception("文件路径不能为空"); System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动 p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息 p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息 p.StartInfo.RedirectStandardError = true;//重定向标准错误输出 p.StartInfo.CreateNoWindow = true;//不显示程序窗口 p.Start();//启动程序 //向cmd窗口发送输入信息 //拼接命令 //string cmdstr = string.Format(@"copy /b {0}\*.ts {1}\{2}_完整版.ts",videoPath,savePath,fileNmae); string cmdstr = string.Format(@"copy /b {0} {1}\{2}", string.Join("+", nameList), savePath, fileNmae); p.StandardInput.WriteLine(cmdstr + "&exit"); p.StandardInput.AutoFlush = true; //获取cmd窗口的输出信息 string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();//等待程序执行完退出进程 p.Close(); }