C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!

摘要:
最近,基于C#的拖缆的发展并不理想。最后,经过不懈的努力,我取得了一些成绩。这是一张便条;本文重点介绍如何将ffmpeg用于简单的流式传输。如果没有官方文档WithFilter.WithField,简单的代码行似乎很难。拉动();以上是流和获取流的核心代码,保存在本地=TargetType。Live){thrownewApplicationException;}//当参数为false时,它是流式的var@params=获取参数;加工机FFmpeg;}//////从RTMP服务器拉取流——读取视频数据==pullstreamfromrtmpserver//publicvoidPull(){Validate();if(!类似地,获取流也是如此。

最近开发了基于C#的推流器一直不大理想,终于在不懈努力之后研究了一点成果,这边做个笔记;本文着重在于讲解下如何使用ffmpeg进行简单的推流,看似简单几行代码没有官方的文档很吃力。并获取流的源代码:如下→

            #region RTMP推流(**已成功推流至服务器**)Network.Create()
                .WithSource(inputPath)//inputPath可以改成获取设备的视频流
                .WithDest("rtmp://192.168.61.128/live/livestream")//可以根据自己的需求更新RTMP服务器地址
                .WithFilter(new X264Filter { ConstantQuantizer = 20})
                .WithFilter(newResizeFilter(Resolution.X720P))
                .Push();

            #endregion
Network.Create()
                .WithSource("rtmp://192.168.61.128/live/livestream")//inputPath可以改成获取设备的视频流
                .WithDest(inputPath)//这个路径可以自由更改,如果是直播就不需要使用这个路径,直接读取流至播放器播放实时接收即可。
                .WithFilter(new X264Filter { ConstantQuantizer = 20})
                .WithFilter(newResizeFilter(Resolution.X720P))
                .Pull();

以上分别是推流和获取流保存在本地的核心代码。

1:首先建立服务器与客户端的连接;

2:初始化服务器地址;

3:初始化路径;

4:视频属性设定;

5:推/拉流操作;

  /// <summary>
        ///推流到RTMP服务器
        /// </summary>
        public voidPush()
        {
            Validate();

            if (_destType !=TargetType.Live)
            {
                throw new ApplicationException("当推流到RTMP服务器的时候,源类型必须是'RtmpType.Live'类型.");
            }

            //参数为false的时候则为推流
            var @params = GetParams(false);

            Processor.FFmpeg(@params);
        }
  /// <summary>
        ///把流从RTMP服务器拉取--读取视频数据 ==pull a stream from rtmp server
        /// </summary>
        public voidPull()
        {
            Validate();

            if (!TestRtmpServer(_source, true))
                throw new ApplicationException("RTMP服务器发送错误.");

            if (_sourceType !=TargetType.Live)
            {
                throw new ApplicationException("必须是RTMP服务器.");
            }
            //参数为true的时候则为读取视频流
            var @params = GetParams(false);

            Processor.FFmpeg(@params);
        }
 /// <summary>
        ///检测输出输入源以及过滤器
        /// </summary>
        private voidValidate()
        {
            if (_sourceType ==TargetType.Default)
                throw new ApplicationException("源错误.请输入源!");

            if (_destType ==TargetType.Default)
                throw new ApplicationException("dest错误.请输入一个dest");

            var supportFilters = new[] { "Resize", "Segment", "X264", "AudioRate", "AudioBitrate"};

            if (_filters.Any(x => !supportFilters.Contains(x.Name)))
            {
                throw new ApplicationException(string.Format("过滤器不支持,过滤器只支持:{0} 类型",
                    supportFilters.Aggregate(string.Empty, (current, filter) => current + (filter + ",")).TrimEnd(new[] { ','})));
            }
        }

这是推流所使用的方法,Validate()→这个方法主要用于:检测输出输入源以及过滤器;其次检测输入流的状态是否为文件(File还是Live);最后调用ffmpeg进行处理输入的参数方法进行处理。

同理,获取流也是如此。

接下来演示下效果:(推流成功之后就会有如下图所示的效果,可以自行调用Directshow等第三方播放器或者自带的ffplay进行播放)

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!第1张C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!第2张

接下来是这个拉取流的效果:图中未完成读取的时候是下图

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!第3张

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!第4张

C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!第5张

值得注意的是,接收是从你开始接收的位置开始的,视频推流是根据一帧一帧推送的,而我们接收流的方式也是一帧一帧的接收,所以图中显示的其实是已经播放到末尾的视频,这样防止了视频重复上传,重复下载。

备注:【思路仅供参考】

免责声明:文章转载自《C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Cesium深入浅出之可视域分析【转】删除隐藏网卡(本机IP地址被占用)4个方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

deepfakes-FaceSwap使用笔记

安装过程 安装指南网址:https://github.com/deepfakes/faceswap/blob/master/INSTALL.md 需要魔法上网,有些包国内下载太慢了 conda环境 在Anaconda Prompt里,查看所有环境,两个命令都行 conda env listconda info --envs  查看安装的包 conda l...

FFMPEG 配置选项详细说明

转自:https://blog.csdn.net/z2066411585/article/details/81239446 用法:配置[选项] 选项:[描述后括号中的默认值] 帮助选项: --help 打印此消息 --quiet 抑制显示信息输出 --list-decoders 显示所有可用的解码器 --list-encoders 显示所有可用的编码器 -...

ffmpeg基础使用

原文地址: https://www.jianshu.com/p/ddafe46827b7 参考ffmpeg常用命令ffmpeg参数中文详细解释[总结]FFMPEG视音频编解码零基础学习方法 一、安装 打开https://ffmpeg.zeranoe.com/builds/,该网站中的FFMPEG分为3个版本:Static,Shared,Dev。 前两个版本...

ffmpeg 踩坑实录 添加实时水印(二)

一、背景介绍       最近领导要求做一个视频录制的相关项目。其中,需要对视频文件进行添加 实时时间水印。于是,我想到了使用之前的ffmpeg来做。 二、ffmpeg实际操作        首先把需要添加水印的视频文件,上传到服务器指定位置 比如 “/usr/local/1.mp4”,这样的地方。其次,我们需要了解如何去给视频添加水印。 这里提供两种方式...

二、实践与视频解决方案

一、视频解决方案 说明: 公司下户拍摄视频,上传存储一直用的优酷云(视频压缩、解码、播放)当然还支持水印。 现在场景,我们公司内部买服务器,下户拍摄视频上传到我们自己服务内,需要解决的问题,下户拍摄视频很大,需要解决的问题: 1、(下户视频过大)需要压缩处理、 2、(视频格式、播放帧处理)解码格式 3、(提供url)提供接口让内部人员可以播放  解决方案1...

ffmpeg参数说明(转载)

ffmpeg.exe -i F:\闪客之家\闪客之歌.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\11.flv ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv 使用-ss参数 作用(time_off set...