使用ffmpeg实现视频连接


使用ffmpeg实现视频连接

参考路径: https://blog.csdn.net/u014702999/article/details/52530742

 

最近项目需要实现一个视频连接功能,即将一些小的视频片段连接成一个视频,项目开发用的是C#语言。

最终决定使用ffmpeg。

FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多codec都是从头开发的。

更多关于ffmpeg介绍看 http://baike.baidu.com/view/856526.htm?fr=aladdin

以前也没有接触过ffmpeg,首先去官网现在windows平台的ffmpeg。

下载地址: http://ffmpeg.zeranoe.com/builds/

其中有三个版本,适用于不同情况。下载完成后解压其目录结构如下:

运行ff-prompt批处理命令,在其中输入相应的指令即可完成操作。

连接视频的命令如下:

  1.  
    ffmpeg -i "1.mp4" -qscale 6 "inputfile_01.mpg"
  2.  
    ffmpeg -i "2.mp4" -qscale 6 "inputfile_02.mpg"
  3.  
    copy /b "inputfile_01.mpg"+"inputfile_02.mpg" "inputfile_all.mpg"
  4.  
    ffmpeg -i inputfile_all.mpg -qscale 6 outputfile.mp4
  5.  
    del "inputfile_01.mpg"
  6.  
    del "inputfile_02.mpg"
  7.  
    del "inputfile_all.mpg"

上述命令只能连接两个视频的连接,因为在程序中无法事先确定视频数量,因此采用list集合来存储需要连接视频绝对路径,然后使用循环方式连接视频,具体代码如下:

using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.IO; using System.Collections; using System.Threading; namespace MP4 {  class BatDemo  {   public void saveVedio(IList list, string name)   {    /*    * 初始命令的定义    * conert将集合中的第一个视频转换成mpg格式    * conert1将集合中第二个视频转换成mpg格式    * merge将前两个转换的mpg格式视频合并成一个名为inputfile.mpg视频    * delstart删除第一个转换视频    * delsecond删除第二个转换视频    * convertany将剩下的视频依次转换为mpg格式    * mergeany将转换后的视频与inputfile.mpg合并    * delany将剩下的转换视频依次删除    * convertfinish将最终生成的mpg视频转换成mp4格式    */    string batPath = @"e:\ffmpeg\ff-prompt.bat";    string conert = "ffmpeg -i \"" + list[0] + "\" -qscale 6 \"inputfile_01.mpg\"";    string conert1 = "ffmpeg -i \"" + list[1] + "\" -qscale 6 \"inputfile_02.mpg\"";    string merge = "copy /b \"inputfile_01.mpg\"+\"inputfile_02.mpg\" \"inputfile1.mpg\"";    string delstart = "del \"inputfile_01.mpg\"";    string delsecond = "del \"inputfile_02.mpg\"";    RunBat(batPath, conert);    Thread.Sleep(300);    RunBat(batPath, conert1);    Thread.Sleep(300);    RunBat(batPath, merge);    Thread.Sleep(300);    RunBat(batPath, delstart);    Thread.Sleep(300);    RunBat(batPath, delsecond);    Thread.Sleep(300);    string tempName = "inputfile1.mpg";    for (int i = 2; i < list.Count-1; i++)    {     tempName = "inputfile" + i+".mpg";     string deltemp = "inputfile" + (i - 1 )+ ".mpg";     //生成的下一个mpg与上一个合成的mpg文件不能重名,否则造成覆盖。     string convertany = "ffmpeg -i \"" + list[i] + "\" -qscale 6 \"inputfile_01.mpg\"";     RunBat(batPath, convertany);     Thread.Sleep(300);     string mergeany = "copy /b \"inputfile_01.mpg\"+\""+deltemp+"\" \""+tempName+"\"";     RunBat(batPath, mergeany);     Thread.Sleep(300);     RunBat(batPath, delstart);     Thread.Sleep(300);     string delany = "del \""+deltemp+"\"";     RunBat(batPath, delany);     Thread.Sleep(300);    }    string final = "ffmpeg -i \"" + list[list.Count-1] + "\" -qscale 6 \"inputfile_final.mpg\"";    string mergefinal = "copy /b \"inputfile_final.mpg\"+\""+tempName+"\" \"inputfilefinal.mpg\"";    string convertTomp4 = "ffmpeg -i inputfilefinal.mpg -qscale 6 " + name;    RunBat(batPath, final);    Thread.Sleep(300);    RunBat(batPath, mergefinal);    Thread.Sleep(300);    RunBat(batPath, convertTomp4);      }   /// <summary>   /// 调用指定的命令   /// </summary>   /// <param name="batPath"></param>   /// <param name="cmd"></param>   public void RunBat(string batPath,string cmd)   {    Process pro = new Process();    FileInfo file = new FileInfo(batPath);    pro.StartInfo.WorkingDirectory = file.Directory.FullName;    pro.StartInfo.FileName = batPath;    pro.StartInfo.CreateNoWindow = false;    pro.StartInfo.UseShellExecute = false;    pro.StartInfo.RedirectStandardInput = true;    pro.StartInfo.RedirectStandardOutput = true;    pro.Start();    pro.StandardInput.WriteLine(cmd);   }  } }

通过调用该类的saveVedio方法指定需要连接视频的绝对路径的集合,以及生成视频的绝对路径后即可。

注意,使用该方法连接视频是逆序连接,也就是最后路径的视频连接后在最前面。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM