直播软件开发如何使用FFMPEG推流并保存在本地
时间:2022-07-25
本文章向大家介绍直播软件开发如何使用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进行播放)
接下来是这个拉取流的效果:图中未完成读取的时候是下图
值得注意的是,接收是从你开始接收的位置开始的,视频推流是根据一帧一帧推送的,而我们接收流的方式也是一帧一帧的接收,所以图中显示的其实是已经播放到末尾的视频,这样防止了视频重复上传,重复下载。
备注:【思路仅供参考】
本文转载自网络,感谢原作者的分享,转载仅为分享干货知识,如有侵权欢迎联系作者进行删除处理。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php分享朋友圈的实现代码
- Laravel框架Request、Response及Session操作示例
- 利用scikitlearn画ROC曲线实例
- 小程序微信退款功能实现方法详解【基于thinkPHP】
- PHP回调函数简单用法示例
- PHP explode()函数用法讲解
- 详解提高使用Java反射的效率方法
- PHP fopen函数用法实例讲解
- python正则表达式的懒惰匹配和贪婪匹配说明
- PyQt5-QDateEdit的简单使用操作
- thinkphp5实现无限级分类
- Python numpy矩阵处理运算工具用法汇总
- Django后端分离 使用element-ui文件上传方式
- PHP fprintf()函数用法讲解
- django template实现定义临时变量,自定义赋值、自增实例