不得不說FFMPEG真是個神奇的玩意,所接觸的部分不過萬一。網上有個很火的例子是c++方面的,當然這個功能還是用c++來實現比較妥當。
然而我不會c++
因為我的功能需求比較簡單,只要實現基本的錄制就可以了,其實就是一句命令的事
先來代碼:RecordHelper類
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.DirectX; using Microsoft.DirectX.DirectSound; using System.Runtime.InteropServices; namespace ClassTool { public class RecordHelper { #region 模擬控制臺信號需要使用的api [DllImport( " kernel32.dll " )] static extern bool GenerateConsoleCtrlEvent( int dwCtrlEvent, int dwProcessGroupId); [DllImport( " kernel32.dll " )] static extern bool SetConsoleCtrlHandler(IntPtr handlerRoutine, bool add); [DllImport( " kernel32.dll " )] static extern bool AttachConsole( int dwProcessId); [DllImport( " kernel32.dll " )] static extern bool FreeConsole(); #endregion // ffmpeg進程 static Process p = new Process(); // ffmpeg.exe實體文件路徑 static string ffmpegPath = AppDomain.CurrentDomain.BaseDirectory + " ffmpeg\\ffmpeg.exe " ; /// <summary> /// 獲取聲音輸入設備列表 /// </summary> /// <returns> 聲音輸入設備列表 </returns> public static CaptureDevicesCollection GetAudioList() { CaptureDevicesCollection collection = new CaptureDevicesCollection(); return collection; } /// <summary> /// 功能: 開始錄制 /// </summary> public static void Start( string audioDevice, string outFilePath) { if (File.Exists(outFilePath)) { File.Delete(outFilePath); } /* 轉碼,視頻錄制設備:gdigrab;錄制對象:桌面; * 音頻錄制方式:dshow; * 視頻編碼格式:h.264; */ ProcessStartInfo startInfo = new ProcessStartInfo(ffmpegPath); startInfo.WindowStyle = ProcessWindowStyle.Normal; startInfo.Arguments = " -f gdigrab -framerate 15 -i desktop -f dshow -i audio=\" " + audioDevice + " \" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame \" " + outFilePath + " \" " ; p.StartInfo = startInfo; p.Start(); } /// <summary> /// 功能: 停止錄制 /// </summary> public static void Stop() { AttachConsole(p.Id); SetConsoleCtrlHandler(IntPtr.Zero, true ); GenerateConsoleCtrlEvent( 0 , 0 ); FreeConsole(); } } }
開始那幾個api接口是用來模擬ctrl+c命令的。本來以為在停止錄制的時候直接kill掉進程就好,結果導致生成的視頻文件直接損壞了。手動使用ffmpeg.exe的時候發現ctrl+c可以直接結束錄制并且不會損壞視頻文件,于是采用這種方法,在點擊停止按鈕時模擬ctrl+c來退出ffmpeg。
ffmpeg的命令參數里,gdigrab是ffmpeg內置的屏幕錄制設備,但是這個設備不能同時采集音頻,于是又用到了后面的dshow。這里有個問題很奇怪,用ffmpeg獲取音頻設備列表時,設備的名稱如果超過31個字符的話會被截斷,而若是將完整的設備名傳到參數里則無法進行音頻采集,只能將截斷的設備名稱傳進去,不知道為什么……
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
