使用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