复制FFMpeg到目标目录
项目->属性->生成事件->生成前事件命令行
添加如下
复制目录
| 1
 | xcopy /Y /i /e $(ProjectDir)\ffmpeg $(TargetDir)\ffmpeg
 | 
复制文件
| 1
 | xcopy  /Y /d $(ProjectDir)\ffmpeg\* $(TargetDir)\ffmpeg\
 | 
获取音频输入设备
使用NuGet添加 NAudio
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 
 | using NAudio.CoreAudioApi;using System.Collections.Generic;
 
 namespace ZJClassTool.Utils
 {
 public class ZJAudioModel : ZJNotifyModel
 {
 private string _name;
 
 public string name
 {
 get { return _name; }
 set
 {
 _name = value; OnPropertyChanged("name");
 }
 }
 
 public string id { get; set; }
 private bool _selected = true;
 
 public bool selected
 {
 get { return _selected; }
 set { _selected = value; OnPropertyChanged("selected"); }
 }
 
 public static List<ZJAudioModel> getAudioDevice()
 {
 List<ZJAudioModel> audioList = new List<ZJAudioModel>();
 var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator();
 
 //允许你在某些状态下枚举渲染设备
 var endpoints = enumerator.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);
 foreach (var endpoint in endpoints)
 {
 ZJAudioModel audioModel = new ZJAudioModel();
 audioModel.name = endpoint.FriendlyName;
 audioModel.id = endpoint.ID;
 audioList.Add(audioModel);
 }
 return audioList;
 }
 }
 }
 
 | 
使用FFmpeg推流
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 
 | using System;using System.Diagnostics;
 using System.IO;
 
 namespace ZJClassTool.Utils
 {
 internal class ZJRtmpPush
 {
 // ffmpeg进程
 public static Process p = new Process();
 
 // ffmpeg.exe实体文件路径
 private static string ffmpegPath = AppDomain.CurrentDomain.BaseDirectory + "ffmpeg\\ffmpeg.exe";
 
 /// <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.Hidden;
 
 var parastr = string.Format("-f gdigrab -framerate 15 -i desktop -f dshow -i audio=\"{0}\" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -acodec libmp3lame \"{1}\"", audioDevice, outFilePath);
 startInfo.Arguments = parastr;
 p.StartInfo = startInfo;
 
 p.Start();
 }
 
 /// <summary>
 /// 功能: 开始推流
 /// </summary>
 public static void StartPush(string audioDevice, string pushUrl)
 {
 /*转码,视频录制设备:gdigrab;录制对象:桌面;
 * 音频录制方式:dshow;
 * 视频编码格式:h.264;*/
 ProcessStartInfo startInfo = new ProcessStartInfo(ffmpegPath);
 startInfo.WindowStyle = ProcessWindowStyle.Hidden;
 var parastr = string.Format("-f gdigrab -framerate 15 -i desktop -f dshow -i audio=\"{0}\" -filter:v scale=w=trunc(oh*a/2)*2:h=720 -vcodec libx264 -preset:v ultrafast -acodec libmp3lame -maxrate 1000k -pix_fmt yuv422p -f flv \"{1}\"", audioDevice, pushUrl);
 startInfo.Arguments = parastr;
 p.StartInfo = startInfo;
 // Console.WriteLine("parastr:" + parastr);
 p.Start();
 }
 
 /// <summary>
 /// 功能: 停止录制
 /// </summary>
 public static void Stop()
 {
 p.Kill();
 p.StartInfo.Arguments = "";
 }
 }
 }
 
 | 
实际上执行的推流命令
| 1
 | ffmpeg -f gdigrab -framerate 15 -i desktop -f dshow -i audio="Internal Microphone (Cirrus Logic CS8409 (AB 51))" -filter:v scale=w=trunc(oh*a/2)*2:h=720 -vcodec libx264 -preset:v ultrafast -acodec libmp3lame -maxrate 1000k -pix_fmt yuv422p -f flv "rtmp://live.psvmc.cn/test/01"
 | 
具体参数根据自己实际情况调整即可
 转自:https://www.psvmc.cn/article/2020-01-08-wpf-start-07-ffmpeg.html