C# FFmpeg 暫停錄屏以及錄音的方法
阿新 • • 發佈:2018-12-22
1 FFmpeg錄屏以及錄音的命令
最近需要用到FFmpeg錄製音效卡中的聲音,在cmd.exe的命令列中使用正常的錄音命令:
ffmpeg -f dshow -i audio="virtual-audio-capturer" -acodec aac f:\temp.aac
是可以實現錄製的
然後按照官方的按Q鍵暫停錄製
也是正常的停止錄製了,bingo。
2 C#如何不在cmd.exe中去正常的停止FFmpeg錄音
/// <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,把ffmpeg.exe作為第三方應用程式以視窗隱藏的方式開啟並傳入FFmpeg錄屏或者是錄音的引數,而在停止的錄製的邏輯上,主要是模擬開啟的ffmpeg.exe的控制檯視窗中按下Ctrl+C鍵,但是這種方式在新版的FFmpeg中已經失效,新版FFmpeg中需要通過按q鍵來暫停錄製,所以經過一番摸索,將上述前輩的程式碼進行了修改,親測可用,這裡要說下,是Unity3D的C#指令碼,可進行參考
Process AudioRecorderProcess = new Process(); public void CreateAudio(string audioName,string outFileName) { string curDir = System.Environment.CurrentDirectory; AudioRecorderProcess.StartInfo.FileName = curDir + @"/ffmpeg.exe"; string arg = string.Format("-f dshow -i audio=\"{0}\" -acodec aac \"{1}\"", audioName, outFileName); AudioRecorderProcess.StartInfo.Arguments = arg;//引數 AudioRecorderProcess.StartInfo.UseShellExecute = false;//不使用作業系統外殼程式啟動 AudioRecorderProcess.StartInfo.RedirectStandardError = true;//重定向標準錯誤流 AudioRecorderProcess.StartInfo.CreateNoWindow = true;//預設不顯示視窗 AudioRecorderProcess.StartInfo.RedirectStandardInput = true;//這句一定需要,用於模擬該程序控制檯的輸入 AudioRecorderProcess.ErrorDataReceived += new DataReceivedEventHandler(Output);//輸出流的事件 AudioRecorderProcess.Start();//啟動 AudioRecorderProcess_ID = AudioRecorderProcess.Id; AudioRecorderProcess.BeginErrorReadLine();//開始非同步讀取 } public void StartRecord() { CreateAudio("virtual-audio-capturer", string.Format("Audio_Result/{0}.aac","temp")); } public void StopRecord() { AudioRecorderProcess.StandardInput.WriteLine("q");//在這個程序的控制檯中模擬輸入q,用於暫停錄製 AudioRecorderProcess.Close(); AudioRecorderProcess.Dispose(); }
OKOK,阿西吧。
這只是C#,比如C/C++也可以通過呼叫系統API載入ffmpeg.exe的方式進行錄屏或者錄音,然後模擬輸入q用於暫停錄製。