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

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

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

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

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

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

2:初始化服务器地址;

3:初始化路径;

4:视频属性设定;

5:推/拉流操作;

  /// <summary>
        /// 推流到RTMP服务器
        /// </summary>
        public void Push()
        {
            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 void Pull()
        {
            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 void Validate()
        {
            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进行播放)

 

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

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

时间: 2024-10-10 02:17:58

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

简单的从服务器获取图片保存到本地

1.先创建一个web工程,在webroot目录下放一张图片 2.将工程挂到服务器 3.创建一个java工程 源码:(myhhtp工程) package myhttp; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; imp

scrapy爬虫系列之三--爬取图片保存到本地及日志的基本用法

功能点:如何爬取图片,并保存到本地 爬取网站:斗鱼主播 完整代码:https://files.cnblogs.com/files/bookwed/Douyu.zip 主要代码: douyu.py import scrapy import json from Douyu.items import DouyuItem class DouyuSpider(scrapy.Spider): name = 'douyu' allowed_domains = ['douyucdn.cn'] base_url

FFmpeg命令读取RTMP流如何设置超时时间

子标题:FFmpeg命令录制RTMP流为FLV文件时如何设置超时时间 | FFmpeg命令如何解决录制产生阻塞的问题   0x001: 前言 今天在测试程序时遇到两个问题.Q1:ffmpeg录制RTMP流并保存为FLV文件时,推RTMP流的线程已经结束断掉了,而录制的线程却还一直在录.Q2:ffmpeg录制RTMP流并保存为FLV文件时,被录制的RTMP流并未推流或并无此房间频道,而录制的线程却还一直在录. 观察日志文件发现录制程序一直阻塞在某个时间点上,经查验这是因为ffmpeg在拉取RTMP

使用FFmpeg转录网络直播流

爱奇艺万能播放器的最新版本增加了一个播放网络流的功能.不过,入口藏在播放器区域的右键菜单里,不太好找: 找来一个直播流URL,比如东森新闻 http://60.199.188.151/HLS/WG_ETTV-N/index.m3u8,试了一下,还不赖呢! 有时候,看到精彩的直播内容,想把某些片段保存到本地.无奈播放器不提供这样的功能.那么,开个小窗给FFmpeg吧,它可以搞定! 命令行如下: ffmpeg -i http://60.199.188.151/HLS/WG_ETTV-N/index.

用ffmpeg推流到nginx

用ffmpeg推流到nginx [1]第一个是推到了上面配置的live节点上:[RTMP模块] ffmpeg -i /data/recorded_flvs/1028_test8-1475221725.flv -c:v libx264 -b:v 500k -c:a libfdk_aac -b:a 64k -f flv rtmp://120.26.206.180/live/strea123.flv 说明:红色为需要推送的文件,绿色为RTMP流, 运行成功界面: [2]第二个推送到hls上: ffmp

httpWebRequest获取流和WebClient的文件抓取

昨天写一个抓取,遇到了一个坑,就是在获取网络流的时候,人为的使用了stream.Length来获取流的长度,获取的时候会抛出错误,查了查文档,原因是某些流是无法获取到数据的长度的,所以不能直接得到.如果是常和stream打交道就能避免这个问题.其实直接使用do-while来获取就行了,代码如下: int i=0; do { byte[] buffer = new byte[1024]; i = stream.Read(buffer, 0, 1024); fs.Write(buffer, 0, i

获取远程图片保存到本地文件夹中

1 /** 2 * 抓取远程图片到本地,可以抓取不带有后缀的图片 3 * @author YanYing <[email protected]> 4 * @link bidianer.com 5 */ 6 class GrabImage{ 7 8 /** 9 * @var string 需要抓取的远程图片的地址 10 * 例如:http://www.bidianer.com/img/icon_mugs.jpg 11 * 有一些远程文件路径可能不带拓展名 12 * 形如:http://www.x

ffmpeg推流时,可能出现错误:Unknown encoder &#39;libx264&#39;

使用如下命令推流时: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4d2f2d; background-color: #dfdbc3 } span.s1 { } ffmpeg -re -i a.mp4 -vcodec libx264 -acodec aac -f flv rtmp://172.31.102.165:1935/myapp 可能会出现如下错误: p.p1 { margin: 0.0px 0.0

推流和拉流的概念以及RTMP和HLS协议

https://www.bbsmax.com/A/x9J2wZM56o/ 推流为将直播内容推送至服务器的过程:拉流为服务器已有直播内容,用指定地址进行拉取的过程. rtmp rtmp是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进