唉 难搞哦,哪个FFMPEG.AutoGen资料实在是太少了,完全没法下手,不是不敢试 而是根本不知道哪里开始。
没办法 只好将官网编译好的EXE程序使用命令行的方式封装进去。
开始动手。
1.新建一个Winform项目.2.获取麦克风名称: 需要引用 NAudio
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)
{
if (device.FriendlyName.StartsWith(deviceInfo.ProductName))
{
comboBox2.Items.Add(device.FriendlyName);
break;
}
}
}
3.添加引用: System.Management
获取摄像头名称:
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Image' OR PNPClass = 'Camera')");
foreach (var device in searcher.Get())
comboBox1.Items.Add(device["Caption"]);
comboBox1.Items.Add("--桌面--");
将FFMPEG通过DOS执行 不显示DOS窗口,
/// <summary>
/// 执行Cmd命令
/// </summary>
/// <param name="dosCommand">dosCmd</param>
/// <returns></returns>
public string Execute(string dosCommand)
{
Console.WriteLine(dosCommand);
return Execute(dosCommand, 10);
}
/// <summary>
/// 执行DOS命令,返回DOS命令的输出
/// </summary>
/// <param name="dosCommand">dos命令</param>
/// <param name="milliseconds">等待命令执行的时间(单位:毫秒),
/// 如果设定为0,则无限等待</param>
/// <returns>返回DOS命令的输出</returns>
string Execute(string command, int seconds)
{
string output = ""; //输出字符串
if (command != null && !command.Equals(""))
{
Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = "cmd.exe",//设定需要执行的命令
//Arguments = command,//“/C”表示执行完命令后马上退出
UseShellExecute = false,//不使用系统外壳程序启动
RedirectStandardInput = true,//不重定向输入
RedirectStandardOutput = true, //重定向输出
CreateNoWindow = true//不创建窗口
};
startInfo.WorkingDirectory=$@"{Application.StartupPath}\";
process.StartInfo = startInfo;
try
{
if (process.Start())//开始进程
{
pid = process.Id;
process.StandardInput.WriteLine(command);
}
}
catch
{
Process[] pro = Process.GetProcessesByName("ffmpeg");
foreach (Process p in pro) p.Kill();
if (pid > -1)
Process.GetProcessById(pid).Kill();
}
finally
{
if (process != null)
process.Close();
}
}
return output;
}
执行的代码
if (comboBox1.SelectedItem.ToString() == "--桌面--")
{
string cmd = "ffmpeg -f dshow -i audio=\"" + comboBox2.SelectedItem + "\" -f dshow -i audio=\"" + comboBox2.SelectedItem + "\" -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f gdigrab -i desktop -vcodec libx264 -r 60.97 -b:v 1500K -codec:a aac -ac 2 -ar 44100 -pix_fmt yuv420p -tune zerolatency -preset ultrafast -f flv \"服务器推流地址";
Execute(cmd);
}
else {
string cmd = "ffmpeg -f dshow -i video=\""+ comboBox1.SelectedItem + "\":audio=\"" + comboBox2.SelectedItem + "\" -vcodec libx264 -r 25 -preset:v ultrafast -tune:v zerolatency -f flv \"服务器推流地址";
Execute(cmd);
}
退出的代码
//关闭FFMEPG进程
Process[] pro = Process.GetProcessesByName("ffmpeg");
foreach (Process p in pro) p.Kill();
//关闭刚刚启动的dos进程
Process.GetProcessById(pid).Kill();
最终是能看到效果,没什么问题 .




bug是肯定有的,不过可以自行处理。
2018





