使用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批處理命令,在其中輸入相應的指令即可完成操作。

連接視頻的命令如下:
-
ffmpeg -i "1.mp4" -qscale 6 "inputfile_01.mpg"
-
ffmpeg -i "2.mp4" -qscale 6 "inputfile_02.mpg"
-
copy /b "inputfile_01.mpg"+"inputfile_02.mpg" "inputfile_all.mpg"
-
ffmpeg -i inputfile_all.mpg -qscale 6 outputfile.mp4
-
del "inputfile_01.mpg"
-
del "inputfile_02.mpg"
-
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); 