前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WPF桌面端开发7-使用FFMpeg进行推流

WPF桌面端开发7-使用FFMpeg进行推流

作者头像
码客说
发布2020-05-09 14:56:28
1.2K0
发布2020-05-09 14:56:28
举报
文章被收录于专栏:码客码客

复制FFMpeg到目标目录

项目->属性->生成事件->生成前事件命令行

添加如下

复制目录

代码语言:javascript
复制
xcopy /Y /i /e $(ProjectDir)\ffmpeg $(TargetDir)\ffmpeg

复制文件

代码语言:javascript
复制
xcopy  /Y /d $(ProjectDir)\ffmpeg\* $(TargetDir)\ffmpeg\

获取音频输入设备

使用NuGet添加 NAudio

代码语言:javascript
复制
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推流

代码语言:javascript
复制
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 = "";
        }
    }
}

实际上执行的推流命令

代码语言:javascript
复制
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"

具体参数根据自己实际情况调整即可

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 复制FFMpeg到目标目录
  • 获取音频输入设备
  • 使用FFmpeg推流
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档