直播软件开发如何使用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进行播放)

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



值得注意的是,接收是从你开始接收的位置开始的,视频推流是根据一帧一帧推送的,而我们接收流的方式也是一帧一帧的接收,所以图中显示的其实是已经播放到末尾的视频,这样防止了视频重复上传,重复下载。
备注:【思路仅供参考】
本文转载自网络,感谢原作者的分享,转载仅为分享干货知识,如有侵权欢迎联系作者进行删除处理。
直播软件开发如何使用FFMPEG推流并保存在本地的更多相关文章
- 直播软件开发关于Android、iOS中的视频采集步骤
很多人对直播软件开发还是抱有想法的,但是在这个资本冷静的市场下,直播平台该怎么玩,在直播软件开发过程中哪些功能是必须具备的,这都是值得关注的话题.今天我们给大家分享一份详细的直播软件开发关于Andro ...
- 利用Nginx搭建RTMP视频直播,点播服务器,ffmpeg推流,回看
一.环境和工具 ubuntu 14.04 desktop 不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦. 不建议使用 最新的16TLS,我一开始 ...
- 一步一步实现直播软件源码的RTMP推流流媒体服务
第一步:准备工具 OBS推流工具下载及配置可以参见:OBS推流工具 第二步:安装流媒体服务 Windows/Linux系统环境中搭建直播流媒体服务 极速安装,下载解压一键启动即可,支持Windows和 ...
- 【Android 直播软件开发:音视频硬解码篇】
开篇 炙手可热,望而生畏的音视频开发 时至今日,短视频App可谓是如日中天,一片兴兴向荣.随着短视频的兴起,音视频开发也越来越受到重视,但是由于音视频开发涉及知识面比较广,入门门槛相对较高,让许许多多 ...
- iOS开发小技巧--实现将图片保存到本地相册
一.报错的代码 错误 -- out of bounds 超出界限的意思 *** Terminating app due to uncaught exception 'NSInvalidArgument ...
- 开发RTSP 直播软件 H264 AAC 编码
上一篇对摄像头预览,拍照做了大概的介绍,现在已经可以拿到视频帧了,在加上 RTSP 实现,就是直播的雏形,当然还要加上一些 WEB 管理和手机平台的支援,就是一整套直播软件. 介绍一些基础概念:RTP ...
- 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...
- C#使用FFMPEG推流,并且获取流保存在本地,随时取媒体进行播放!
最近开发了基于C#的推流器一直不大理想,终于在不懈努力之后研究了一点成果,这边做个笔记:本文着重在于讲解下如何使用ffmpeg进行简单的推流,看似简单几行代码没有官方的文档很吃力.并获取流的源代码:如 ...
- srs安装与ffmpeg推流
环境说明:ubuntu 16.04 当前目录为~/. 一. 下载 git clone https://github.com/ossrs/srs.git 二.部署SRS 关闭防火墙,执行如下命令. uf ...
随机推荐
- 【漏洞复现】S2-052 (CVE-2017-9805)
一.漏洞描述 Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行. 二.受影响版本 Struts2 ...
- JavaScript reduce()的使用
语法 arr.reduce(callback(accumulator, currentValue, index, array), initialValue) 参数 callback 执行数组中每个值 ...
- Dockerize ASP。净样板项目
Get the source code from the Github repository. 介绍 在这篇文章中,我将一步步地向你展示如何在Docker上运行ABP模块零核心模板.然后,我们将讨论其 ...
- Spring Cloud Config配置git私钥出错
重装了电脑之后,重新生成了ssh key文件id_rsa和id_rsa.pub文件. 然后在配置中心的配置了私钥之后启动项目,报错如下: Reason: Property 'spring.cloud. ...
- 浅谈Samsung Exynos4412处理器
转载于:http://www.cnblogs.com/android210/archive/2013/01/16/2862349.html Topic:浅谈Samsung Exynos4412处理器( ...
- MeteoInfoLab脚本示例:天气现象符号
天气现象符号分布图实际就是散点图,可以用scatterm函数绘制,但之前需要创建天气符号图例,用weatherspec函数.如果只需要绘制某些天气现象(比如雾.霾),可以给出相应的天气符号序号列表(可 ...
- 程序3-6 WERTYU
把手放在键盘上时,稍不注意就会往右错一 位.这样,输入Q会变成输入W,输入J会变成输 入K等.键盘如图3-2所示. 输入一个错位后敲出的字符串(所有字母均 大写),输出打字员本来想打出的句子.输入保 ...
- 【Flutter 混合开发】嵌入原生View-iOS
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- nginx安全:配置网站图片防盗链
一,为什么要做防盗链? 1,什么是盗链? 比如某人有一个A网站, 他不愿自己存储图片,(因为磁盘和带宽都有成本) 就在自己A网站的页面上直接插入B网站的图片, 从而为自己吸引流量,这就是盗链 2,为什 ...
- JS实现将二维数组生成到页面上
前言 之前没说过数组,现在来写一下数组 CSS span { border:2px solid skyblue; width:30px; height: 30px; display: inline-b ...