做直播推流的前提是要有直播服务器接收直播流,所以需要我们自己建设一个流媒体服务器。

流媒体服务器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进行直播推流的更多相关文章

  1. 了不起的WebRTC:生态日趋完善,或将实时音视频技术白菜化

    本文原文由声网WebRTC技术专家毛玉杰分享. 1.前言 有人说 2017 年是 WebRTC 的转折之年,2018 年将是 WebRTC 的爆发之年,这并非没有根据.就在去年(2017年),WebR ...

  2. 腾讯技术分享:微信小程序音视频技术背后的故事

    1.引言 微信小程序自2017年1月9日正式对外公布以来,越来越受到关注和重视,小程序上的各种技术体验也越来越丰富.而音视频作为高速移动网络时代下增长最快的应用形式之一,在微信小程序中也当然不能错过. ...

  3. 下周二推出“音视频技术WebRTC初探”公开课,欢迎捧场!

     下周二推出"音视频技术WebRTC初探"公开课,欢迎捧场! 公开课课程链接:http://edu.csdn.net/huiyiCourse/detail/90 课程的解说资料 ...

  4. Android 开发 音视频从入门到提高 任务列表 转载

    <Android 音视频从入门到提高 —— 任务列表> 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 Vi ...

  5. Android 音视频开发入门指南

    Android 音视频从入门到提高 —— 任务列表 http://blog.51cto.com/ticktick/1956269(以这个学习为基础往下面去学习) Android 音视频开发学习思路-- ...

  6. Android IOS WebRTC 音视频开发总结(七十)-- 移动端音视频技术优化的七个方向

    最近直播很火,很多朋友对背后的技术比较感兴趣,所以今天我们整理一篇关于移动端视频优化的文章,这篇文章是我朋友在一个技术大会上分享过的,更多内容请关注我们的微信公众号:rtcblacker 视频直播为什 ...

  7. 音视频技术“塔尖”之争,网易云信如何C位出道?

    音视频技术“塔尖”之争,网易云信如何C位出道? 社交+美颜.抖音短视频.在线狼人杀.直播竞答.子弹短信……,过往两三年间,互联网新产品和新玩法层出不穷,风口不断切换.这些爆红的网络应用背后,都有一些共 ...

  8. 音视频技术 即时通讯SDK

    视频流中的DTS/PTS究竟是什么?      DTS(解码时间戳)和PTS(显示时间戳)各自是解码器进行解码和显示帧时相对于SCR(系统參考)的时间戳.SCR能够理解为解码器应该開始从磁盘读取数据时 ...

  9. Android IOS WebRTC 音视频开发总结(四九)-- ffmpeg介绍

    本文主要介绍ffmpeg,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,个人微信公众号blacker,更多详见www.rtc.help 说明: ps1:如果直接从webrtc开始学 ...

  10. Android 音视频技术之录音获取实时音量

    一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...

随机推荐

  1. 2022年冬pat乙级考试题目及代码解析附部分错误原因

    快考pat乙级了,花了十块钱做了一下去年冬天的pat乙级,不难,现在在花ac之后的时间来写文章,默默许愿几天后的也不难,但是我们也要做好准备啊~ B-1 谣言检测仪 分数 15 作者 陈越 单位 浙江 ...

  2. ROS服务通信(C++)

    ROS服务通信C++ 效果图 结构总览 友情提醒 每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误 准备工作 第一步:创建工作空间 配置:roscpp rospy std_msg ...

  3. pat乙级 1020 月饼

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> ...

  4. ABAP 拼接PDF

    参考标准程序RSPO_TEST_MERGE_PDF_FILES*--合并PDF data: pdf_merger type ref to cl_rspo_pdf_merge. data: ex typ ...

  5. 实验五Elasticsearch+Kibana展示爬虫数据

    安装elasticsearch-rtf Elasticsearch-rtf相比于elasticsearch而言多加了一些插件,因此我们选择安装Elasticsearch-rtf是一个不错的选择.在安装 ...

  6. linux挂载磁盘步骤

    一.查看需要挂载设备,如下sda(默认路径/dev/sda) 二.新建分区,执行如下命令进入操作 fdisk /dev/sda 1.m 查看可操作的命令 2.键入 n ,根据需要新建分区 3.键入 d ...

  7. 【Linux】ArchLinux 使用之旅

    主要参考以下两个链接进行,安装系统和安装桌面环境. 以官方Wiki的方式安装ArchLinux | viseator's blog ArchLinux安装后的必须配置与图形界面安装教程 | visea ...

  8. Vuex扫描自定义文件夹下的所有文件

    解决问题:当我们规范 model 统一放在某个文件夹下,且可以通过子文件夹分类.当新加model时又不想去修改别的地方. 代码 // /src/sotre/index.js 1 import { cr ...

  9. K8S部署之kubeadm

    K8S部署笔记 一.集群环境说明 主机名 IP地址 说明 k8s-master01 192.168.1.107 master节点 k8s-master02 192.168.1.108 master节点 ...

  10. Selinux讲解

    手动开启/关闭/查询 SELINUX状态的方法在Limx操作系统运行过程中无法使用命令停用 SELINUX,可以在内核启动参数或使用修改配置文件的方式去关闭 SELINUX安全机制.若只是要将 SEL ...