C#中使用ffmpeg合并视频

首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html

然后调用此方法

  public void CombineMp4WithoutTxt(string StrMP4A, string StrMP4B, string StrOutMp4Path)
        {
            Process p = new Process();//建立外部调用线程
            p.StartInfo.FileName = System.Windows.Forms.Application.StartupPath + "\\ffmpeg.exe";//要调用外部程序的绝对路径
            string StrArg = "-i concat:\"" + StrMP4A + "|" + StrMP4B + "\" -vcodec copy -acodec copy " + StrOutMp4Path + " -y";
            p.StartInfo.Arguments = StrArg;

            p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
            p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)
            p.StartInfo.CreateNoWindow = true;//不创建进程窗口
            p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
            p.Start();//启动线程
            p.BeginErrorReadLine();//开始异步读取
            p.WaitForExit();//阻塞等待进程结束
            p.Close();//关闭进程
            p.Dispose();//释放资源
        }

此段代码是异常抛出处理,请自行添加代码

   private void Output(object sendProcess, DataReceivedEventArgs output)
        {
            if (!String.IsNullOrEmpty(output.Data))
            {
                //处理方法...
            }
        }

其中:

StrMP4A代表前视频物理路径如D:\A.mp4,StrMP4B代表后视频物理路径如D:\B.mp4,StrOutMp4Path代表合成的视频物理路径如D:\AB.mp4。

如果合成的效果不理想,如只合并了前视频,或者合并后只有声音都情况,请按照fmpeg.exe的CMD指令进行测试(请自行百度需要的命令),测试完毕修改此行即可

   string StrArg = "-i concat:\"" + StrMP4A + "|" + StrMP4B + "\" -vcodec copy -acodec copy " + StrOutMp4Path + " -y"; 

posted on 2017-09-20 11:49  鲁广广  阅读(5210)  评论(1编辑  收藏  举报

导航