using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using VisioForge.Shared.NAudio.CoreAudioApi; using VisioForge.Shared.NAudio.Wave; namespace Common.system { public class FFMpeg { Process myProcess = null; public void RunFFmpeg(string PathName) { Process[] KillProcessArray = Process.GetProcessesByName("ffmpeg"); Debug.WriteLine(KillProcessArray.Length.ToString()); foreach (var KillProcess in KillProcessArray) { KillProcess.Kill(); } myProcess = new Process(); string MicrophoneName = GetMicrophone(); myProcess.StartInfo.FileName = FileToolsCommon.GetFileAbsolutePath(@"/ffmpeg/bin/ffmpeg.exe"); //ffmpeg.exe的绝对路径 if(string.IsNullOrWhiteSpace(MicrophoneName)) { myProcess.StartInfo.Arguments = "-f dshow -i video=\"screen-capture-recorder\" -f dshow -i audio=\"virtual-audio-capturer\" -vcodec libx264 -acodec libmp3lame -r 15 -crf 22 -f avi " + PathName; //ffmpeg的参数 } else { myProcess.StartInfo.Arguments = "-f dshow -i audio=\"virtual-audio-capturer\" -f dshow -i audio=\"" + MicrophoneName + "\" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -i video=\"screen-capture-recorder\" -pix_fmt yuv420p -vcodec h264 -preset:v ultrafast -tune:v zerolatency -acodec aac -ar 44100 -ac 2 -f avi " + PathName; //ffmpeg的参数 } myProcess.StartInfo.UseShellExecute = false; //不使用操作系统外壳程序启动 myProcess.StartInfo.RedirectStandardError = true; //重定向标准错误输出 myProcess.StartInfo.CreateNoWindow = true; //不显示程序窗口 myProcess.StartInfo.RedirectStandardInput = true; //用于模拟该进程控制台的输入 myProcess.ErrorDataReceived += new DataReceivedEventHandler(Output); myProcess.Start(); myProcess.BeginErrorReadLine(); } public void StopFFmpeg() { //Thread.Sleep(3000); if (myProcess == null) return; myProcess.StandardInput.WriteLine("q");//在这个进程的控制台中模拟输入q,用于暂停录制 myProcess.Close(); myProcess.Dispose(); myProcess = null; //myProcess.Kill(); } private void Output(object sendProcess, DataReceivedEventArgs output) { if (!String.IsNullOrEmpty(output.Data)) Debug.WriteLine(output.Data.ToString()); } /// /// 获取麦克风 /// string GetMicrophone() { List devs = new List(); MMDeviceEnumerator enumberator = new MMDeviceEnumerator(); MMDeviceCollection deviceCollection = enumberator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.All); for (int waveInDevice = 0; waveInDevice < WaveIn.DeviceCount; waveInDevice++) { WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice); foreach (MMDevice device in deviceCollection) { try { if (device.FriendlyName.StartsWith(deviceInfo.ProductName)) { devs.Add(device.FriendlyName); break; } } catch (Exception) { } } } if (devs.Count > 0) { return devs[0]; } else { return ""; } } } }