经常在浏览一些在线视频,是由大量分段视频组成,可以通过合并,并转换成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();
        }