音视频技术入门课- 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 的高级功能和黑科技,还是需要我们自己耐心地去一点点挖掘。

posted on 2022-09-13 20:18  miyan  阅读(2667)  评论(0编辑  收藏  举报