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

            #region RTMP推流(**已成功推流至服务器**)
Network.Create()
.WithSource(inputPath)//inputPath可以改成获取设备的视频流
.WithDest("rtmp://192.168.61.128/live/livestream")//可以根据自己的需求更新RTMP服务器地址
.WithFilter(new X264Filter { ConstantQuantizer = })
.WithFilter(new ResizeFilter(Resolution.X720P))
.Push(); #endregion
            Network.Create()
.WithSource("rtmp://192.168.61.128/live/livestream")//inputPath可以改成获取设备的视频流
.WithDest(inputPath)//这个路径可以自由更改,如果是直播就不需要使用这个路径,直接读取流至播放器播放实时接收即可。
.WithFilter(new X264Filter { ConstantQuantizer = })
.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进行播放)

 

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

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

备注:【思路仅供参考】

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

  1. 直播软件开发如何使用FFMPEG推流并保存在本地

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

  2. java 文件保存到本地

    private void savePic(InputStream inputStream, String fileName) { OutputStream os = null; try { Strin ...

  3. scrapy爬虫系列之三--爬取图片保存到本地

    功能点:如何爬取图片,并保存到本地 爬取网站:斗鱼主播 完整代码:https://files.cnblogs.com/files/bookwed/Douyu.zip 主要代码: douyu.py im ...

  4. byte转文件流 下载到本地

    此方法将byte类型文件转为文件流保存到本地 byte 经过BASE64Decoder 进行编码之后的类型 所以需要解码 防止出现乱码及文件损毁 /** * byte 转文件 下载到本地 * @par ...

  5. FFmpeg流媒体处理-收流与推流

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10623968.html 1. 简介 流媒体是使用了流式传输的多媒体应用技术.如下是维基百 ...

  6. java封装FFmpeg命令,支持原生ffmpeg全部命令,实现FFmpeg多进程处理与多线程输出控制(开启、关闭、查询),rtsp/rtmp推流、拉流

    前言: 之前已经对FFmpeg命令进行了封装http://blog.csdn.net/eguid_1/article/details/51787646,但是当时没有考虑到扩展性,所以总体设计不是太好, ...

  7. SRS流媒体服务器搭建+ffmpeg推流VLC取流观看

    一.编译SRS https://github.com/winlinvip/simple-rtmp-server 目前有1.0-release.2.0.3.0等版本 2.0官方文档地址:https:// ...

  8. 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...

  9. ffmpeg处理rtmp/文件/rtsp的推流和拉流

    ffmpeg处理rtmp/文件/rtsp的推流和拉流   本demo演示了利用ffmpeg从服务器拉流或本地文件读取流,更改流url或文件类型名称发送回服务器或存到本地的作用. 由于本程序只写了3个小 ...

随机推荐

  1. python第五十二天---第九周作业 类 Fabric 主机管理程序

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载)4. 充分使用多线程或多进程5. 不同 ...

  2. java基础-温故而知新(02)

    基本数据的自动拆装箱及享元设计模式 1.1 自动装箱        -128~127 之间的整数,装在一个内存区域.         超过这个范围的整数,装在不同的内存区域. 1.2 自动拆箱     ...

  3. 【PAT】B1079 延迟的回文数(20 分)

    用了柳婼大佬博客的思路,但实现有不同 没有用string所以要考虑字符串末尾的'\0' 用的stl中的reverse逆置字符串 #include<stdio.h> #include< ...

  4. January 18th, 2018 Week 03rd Thursday

    To strive, to seek, to find, and not to yield. 去奋斗,去寻觅,去探索,但绝不屈服. Strive for our dreams, seek the ve ...

  5. WPF之托盘图标的设定

    首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Collections.Generic; using ...

  6. C#的static

    1.static意思是静态,可以修饰类.字段.属性.方法2.标记为static的就不用创建实例对象调用了,可以通过类名直接点出来3.static三种用法:4.用于变量前,表示每次重新使用该变量所在方法 ...

  7. Ajax进阶

    "POST":请求 POST请求:(一共三个方法)<!DOCTYPE html><html lang="en"><head> ...

  8. 转://Linux MultiPath多路径软件实施说明

    Multipath的工作原理 当multipath启动的时候,它通过系统命令scsi_id -eg -s /block/sdX得到proc/partitions 里面所有块设备的 UUID(unive ...

  9. 1226 快速幂 取余运算 洛谷luogu

    还记得 前段时间学习二进制快速幂有多崩溃 当然这次方法略有不同 居然轻轻松松的 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整 ...

  10. 深入浅出的webpack构建工具---AutoDllPlugin插件(八)

    深入浅出的webpack构建工具---AutoDllPlugin插件(八) DllPlugin插件能够快速打包,能把第三方依赖的文件能提前进行预编译打包到一个文件里面去.提高了构建速度.因为很多第三方 ...