1. 程式人生 > >C# FFmpeg 暫停錄屏以及錄音的方法

C# FFmpeg 暫停錄屏以及錄音的方法

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用於暫停錄製。