音视频技术入门课- 05 使用FFmpeg与OBS进行直播推流
做直播推流的前提是要有直播服务器接收直播流,所以需要我们自己建设一个流媒体服务器。
流媒体服务器SRS
SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。官方文档链接:https://ossrs.net/lts/zh-cn/docs/v4/doc/introduction
这里,我用腾讯云服务器来搭建SRS流媒体服务器。先开通防火墙端口。不懂怎么操作的,查看腾讯云官方文档
https://cloud.tencent.com/document/product/213/39740

SRS的安装方式有多种,在这里,我用编译安装方式,
git clone -b develop https://gitee.com/ossrs/srs.git &&
cd srs/trunk && ./configure && make && ./objs/srs -c conf/srs.conf
运行效果:

打开本机http://IP:8080 确认推流地址

FFmpeg 推流
通常,推流服务器的管理界面会提供一个收流的 RTMP 服务器地址,还会提供一个直播流的流名称,也叫串流密钥。例如推流的 RTMP 服务器地址是 rtmp://publish.x.com/live,串流密钥是 stream,那么最后组成的推流地址就是 rtmp://publish.x.com/live/stream。
如果使用 FFmpeg 推 RTMP 流的话,我们需要使用的输出格式为 FLV,那么 FFmpeg 的输入就是 -f flv rtmp://publish.x.com/live/stream
ffmpeg -re -f lavfi -i testsrc=s=1280x720:r=25 -pix_fmt yuv420p -vcodec libx264 -f flv rtmp://publish.x.com/live/stream
FFmpeg 分两大部分,一部分是输入部分,也就是 -i 与 -i 的参数以及它之前的部分,另一部分就是 -i 与 -i 参数后面的部分,为输出部分。仔细划分一下,这条命令行的输入部分是 -re -f lavfi -i testsrc=s=1280x720:r=25,输出部分是 -pix_fmt yuv420p -vcodec libx264 -f flv rtmp://publish.x.com/live/stream。

使用VLC播放器,播放rtmp流地址

从下图中可以看到直播已经开始了,testsrc 的画面已经出来了:

命令行参数
输入部分-re -f lavfi -i testsrc=s=1280x720:r=25 的意思是使用 FFmpeg 的 lavfi 输入格式,也可以说输入的是 lavfi 设备。输入内容是 testsrc,这个 testsrc 是输入 lavfi 格式的内容,lavfi 的格式有很多内容,这些内容不是既有的内容,也不是某个文件,而是 FFmpeg 通过 filter 自己创建出来的。除了 testsrc,还可以创建 testsrc2、color、yuvall 等图像内容(更多可创建的内容你可以查看FFmpeg 官方文档)。输入的图像是 25fps,也就是每秒钟会得到 25 帧图像,图像的宽是 1280 像素,高是 720 像素。
re参数是控制获得图像频率的参数,用来控制输入包的读取速度,比如我们规定一秒钟输入 25 帧,它会把速度控制在 25 帧。因为在 FFmpeg 中数据是以最快的速度读完的,一般在高配的机器上读取速度会非常快。我们用 FFmpeg 自主生成的数据来模拟直播,就需要用 -re 来控制一下速度。但如果我们是读取摄像头还有 RTSP 等直播协议输入的数据,就可以不控制,因为对方输出也是控制频率的。
输出部分-pix_fmt yuv420p -vcodec libx264 -f flv 的意思是先把读取的图像像素点的颜色格式转成 yuv420p 格式。yuv420p 在视频图像格式中是兼容性最好的,使用起来会比较稳定。
接下来编码器部分使用的视频编码器为 libx264。libx264 是一个第三方编码器,这里我们需要注意的是 libx264 的 FFmpeg 需要使用自由软件基金会的通用公共协议的 License,也就是常说的 GPL 协议。作为开源软件发行版使用问题不大,如果商用的话可能需要考虑法律风险。
-f flv 规定我们输出的封装格式为 FLV,用 -f 指定封装格式以后,输出文件的文件名其实也不会有作用,因为 FFmpeg 会强制输出 -f 指定的输出格式。最后输出的文件是一个 RTMP 协议特征字符开头的 URL,所以最终会将 FLV 格式的内容输出到 FFmpeg RTMP 协议内容中。
FFmpeg 参数并不多,尤其是我们常用的能力部分,模块化做得很好,不同的编码器都有自己的参数可以配置,如果我们集中精力只关注我们自己使用的模块部分,参数并不多也很容易记住。
有些人可能想要采集自己的摄像头、桌面等外设,这些通过 FFmpeg 的 -devices 参数可以得到相关的设备信息。通过FFmpeg 的设备相关的操作文档指引信息,我们也可以自己用 FFmpeg 获得摄像头、桌面等外设图像,通过编码推流到直播服务器上。
带界面的推流神器 OBS
OBS 是个桌面应用程序,首先我们需要从 OBS 官方网站下载 OBS 并安装上,安装后打开的界面比较直观。
添加一个本地视频作为直播源头

设置下推流相关的配置内容

推流成功

使用VLC播放直播

更多 OBS 的高级功能和黑科技,还是需要我们自己耐心地去一点点挖掘。
音视频技术入门课- 05 使用FFmpeg与OBS进行直播推流的更多相关文章
- 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化
本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...
- 腾讯技术分享:微信小程序音视频技术背后的故事
1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...
- 下周二推出“音视频技术WebRTC初探”公开课,欢迎捧场!
下周二推出"音视频技术WebRTC初探"公开课,欢迎捧场! 公开课课程链接:http://edu.csdn.net/huiyiCourse/detail/90 课程的解说资料 ...
- Android 开发 音视频从入门到提高 任务列表 转载
<Android 音视频从入门到提高 —— 任务列表> 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 Vi ...
- Android 音视频开发入门指南
Android 音视频从入门到提高 —— 任务列表 http://blog.51cto.com/ticktick/1956269(以这个学习为基础往下面去学习) Android 音视频开发学习思路-- ...
- Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向
最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...
- 音视频技术“塔尖”之争,网易云信如何C位出道?
音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...
- 音视频技术 即时通讯SDK
视频流中的DTS/PTS究竟是什么? DTS(解码时间戳)和PTS(显示时间戳)各自是解码器进行解码和显示帧时相对于SCR(系统參考)的时间戳.SCR能够理解为解码器应该開始从磁盘读取数据时 ...
- Android IOS WebRTC 音视频开发总结(四九)-- ffmpeg介绍
本文主要介绍ffmpeg,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,个人微信公众号blacker,更多详见www.rtc.help 说明: ps1:如果直接从webrtc开始学 ...
- Android 音视频技术之录音获取实时音量
一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...
随机推荐
- 调式源码解决 seata 报错 can not get cluster name 问题
最近在使用Spring Cloud整合分布式事务seata,项目启动之后,控制台一直报错: can not get cluster name in registry config 'service.v ...
- Chai3D之触觉设备
推荐:将 NSDT场景编辑器 加入你的3D开发工具链 介绍 触觉设备是一种双向仪表/致动的人机界面,由人类操作员用于与计算机模拟虚拟环境进行主动交互.触觉设备可以是鼠标.方向盘.指垫.机器人手柄. ...
- Java处理正则匹配卡死(正则回溯问题)
目录 背景 项目现场问题 问题跟踪 优化方案 处理正则问题 使用子线程来匹配正则实现 监控线程实现 最优选择方案 参考文章 正则匹配卡死怎么来的? 背景 背景:这次问题的背景是项目上遇到了,在使用正则 ...
- RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
错误原因:数据有的在cpu上有的在gpu上debug:断点到出错位置查看类型,或者打印`x.is_cuda`查看修改:将cpu上的数据通过`.to(device)`加载到gpu上
- 使用windows平板学习与办公的一些经历(酷比魔方i9篇)
大概是在2019年的时候,我在某平台上购买了900元的二手windows平板电脑,酷比魔方i9 首先谈谈背景.当时我手里是有个笔记本,屏幕大概15.6寸,4G+256G的,平时用的时候功率平均20几W ...
- oracle 行转列,动态年份,月份列。已解决!
-----------------存储过程包体----------- procedure GetComparativeAnalysisTB(p_StartTime varchar2, ----开始时间 ...
- Java密码加密的两种保存方式
密码加密的两种方式(md5和base64) 常见的加密方式有盐值,md5和jdk自带的base64,这里我记录的是base64如何使用,以及破解的方式,话不多说,直接贴代码! 其实md5和加盐值都差不 ...
- Oracle —— 对表数据操作的各种小Tip
1.清空某表数据 TRUNCATE TABLE schema_name.table_name 例如:在名为test的schema下,有一张名为user的表,故此,可用TRUNCATE TABLE te ...
- K8S的 POD 生命周期
pod的生命周期是从创建至终止的这段时间范围 Pod的创建 1.用户通过kubectl或其他api客户端提交需要创建的pod信息给apiServer 2.apiServer开始生成pod对象的信息,并 ...
- 移动自动化-swipe、scroll、drag、高级手势等
swipe 滑动事件 使用方法:driver.swipe(strat_x,start_y,end_x,end_y) swipe通过driver使用 传入起始的位置x和y,和结束的位置x和y 时间参数, ...