首页 > 其他分享 >FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构

FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构

时间:2024-08-30 13:54:36浏览次数:11  
标签:FFmpeg 音视频 开源 直播 RTMP SRT 软件架构

音视频技术的一个主要用途是直播,包括电视直播、电脑直播、手机直播等等,甚至在线课堂、在线问诊、安防监控等应用都属于直播系统的范畴。由于直播系统不仅涉及到音视频数据的编解码,还涉及到音视频数据的实时传输,因此直播领域采用的网络技术标准比较高,实现起来也比一般的WEB系统复杂。

一、直播系统的概念结构

如果仅仅从用户的角度来看,直播系统无非是直播的来源方和直播的观看方。来源方支起三脚架,打开补光灯,调好手机摄像头,一顿操作之后就卿卿我我地开始直播了。观看方打开直播APP,蹭蹭蹭进了直播间,一会儿捏脸蛋,一会儿刷火箭,玩得不亦乐乎。对于一般开发者来说,直播的来源方和直播的观看方之间,还要加上一层用于中转音视频数据的云平台。那么在硬件层面,就构成了直播系统的概念结构,如下图所示。

FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构_直播

可是这个概念结构太笼统了,因为什么软件都没体现,天晓得要怎么实施呀。对于音视频开发者来说,要提供直播系统的软件架构图,才算有指导意义。纵览网络上的直播系统架构文章,很多属于洋洋洒洒的长篇大论,给出的直播系统架构图百转千折,看起来足够专业足够高大上。然而这种直播大全的内容过于丰富,面对巍峨高山一般的直播架构,普通开发者往往望洋兴叹,不得其门而入。

也有的公司贴心提供了专门的音视频直播SDK,只需开发者在代码中调用SDK提供的API,寥寥数行即可实现直播录制和直播观看的功能。不过这种SDK既存在收费使用的可能性,也难以对业务需求做深入定制,毕竟不像开源软件那般自由,当真是鱼与熊掌不可兼得呀。

二、直播系统的软件架构

有鉴于此,博主经过多年的苦心钻研,摸索出了一套全部采用开源软件的直播系统软件架构,废话不多说先看这幅直播系统的软件架构图。

FFmpeg开发笔记(四十八)从0开始搭建直播系统的开源软件架构_直播_02

上面这个直播系统软件架构图依然分成了三个层次,分别说明如下:

1、开源直播录制软件

开源的直播录制软件主要有两种,一种是电脑端的直播录制软件,以OBS Studio、Streamlabs为代表;另一种是手机端的直播录制软件,以RTMP Streamer、SRT Streamer为代表。
OBS Studio是一个开源的直播录制软件,基于QT+FFmpeg编码,它广泛用于视频录制、实时直播等领域。OBS不但开源,而且跨平台,兼容Windows、Mac OS、Linux等操作系统。有关OBS Studio的源码下载、安装过程和使用说明详见之前的文章《使用OBS Studio开启RTMP直播推流》。
RTMP Streamer是一个安卓手机端的开源RTMP直播推流框架,可用于RTMP直播和RTSP直播,其升级版还支持SRT直播(腾讯视频云就采用SRT协议)。RTMP Streamer支持的视频编码包括H264、H265、AV1等等,支持的音频编码包括AAC、G711、OPUS等等。有关RTMP Streamer的源码下载、安装过程和使用说明详见之前的文章《使用RTMP Streamer开启APP直播推流》。
SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等。有关SRT Streamer的源码下载、安装过程和使用说明详见之前的文章《使用SRT Streamer开启APP直播推流》。

2、开源流媒体服务器

开源的流媒体服务器主要有两种,一种是国外的开源流媒体服务器,以MediaMTX和nginx-rtmp为代表;另一种是国产的开源流媒体服务器,以SRS和ZLMediaKit为代表。
MediaMTX是个开源的轻量级流媒体服务器,它的安装过程参见《FFmpeg开发实战:从零基础到短视频上线》一书的“10.2.2  FFmpeg向网络推流”,使用说明详见之前的文章《详解MediaMTX的推拉流》。
nginx-rtmp是开源WEB服务器Nginx可增强的第三方rtmp模块,可以提供简单的rtmp流媒体服务器功能。Nginx默认没开启rtmp模块,需要在编译nginx时添加rtmp模块,还要修改配置文件才能开启rtmp,有关nginx-rtmp的源码下载、安装过程和使用说明详见之前的文章《Linux编译nginx-rtmp实现RTMP推拉流》。
SRS是一款国产的开源实时视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等流媒体协议。SRS与FFmpeg、OBS、VLC、WebRTC等客户端配合使用,提供音视频流的接收和分发的能力,还支持各种音视频协议转换。有关SRS的源码下载、安装过程和使用说明详见之前的文章《Linux环境安装SRS实现视频推流》。
ZLMediaKit是一款国产的开源流媒体服务器,它基于C++11开发,支持多种流媒体协议(RTSP/RTMP/HLS/HTTP-FLV/SRT/WebRTC等),支持的音视频编码标准包括H265、H264、AAC、G711、OPUS等。有关ZLMediaKit的源码下载、安装过程和使用说明详见之前的文章《Linux环境安装ZLMediaKit实现视频推流》。
以上的几种流媒体服务器中,MediaMTX可在Windows系统部署,而nginx-rtmp、SRS、ZLMediaKit均需在Linux系统部署,部署的云平台厂商可选择华为云、阿里云、腾讯云等等。

3、开源音视频播放器

开源音视频播放器主要有两种,一种是电脑端的播放软件,以ffplay和VLC media player为代表;另一种是手机端的播放软件,以ExoPlayer和ijkplayer为代表。
ffplay是FFmpeg自带的播放器程序,可在命令行直接播放音视频文件。在播放音频时,ffplay不仅会让扬声器放出声音,还会在屏幕展示该音频的波形画面。在播放视频时,ffplay会在屏幕展示连续的视频画面,就像看电影看电视那样。有关ffplay的详细用法参见《FFmpeg开发实战:从零基础到短视频上线》一书的“1.4.1  可执行程序”。
VLC media player是一款跨平台的音视频播放器,它不但开源,还兼容多语言,且与FFmpeg深度融合,几乎支持所有的音视频格式。除了常见的音视频文件,VLC media player还能播放RTMP、RTSP等网络串流。有关VLC media player的源码下载、安装过程和使用说明详见《FFmpeg开发实战:从零基础到短视频上线》一书的“3.4.1  通用音视频播放器”。
ExoPlayer是Android官方在Jetpack库中搭载的新型播放器,它的音视频内核依赖于原生的MediaCodec接口,不但能够播放MediaPlayer所支持的任意格式的视频,而且支持包括DASH、HLS、RTMP在内的视频直播协议。有关ExoPlayer的详细用法参见《Android Studio开发实战:从零基础到App上线(第3版)》一书的“14.3.3  新型播放器ExoPlayer”。
ijkplayer是哔哩哔哩公司开发的基于ffplay的手机端开源播放器,它支持rtmp、rtsp、http等流媒体协议的视频直播,还具备B站特有的应用弹幕功能。ijkplayer的源码托管地址在https://github.com/bilibili/ijkplayer,可以在App工程中导入它的依赖包,如下所示。

# 必要的依赖包
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
# 可选的依赖包(其他指令集)
implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
# 可选的实验的ExoPlayer依赖包
implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'

不过ijkplayer基于FFmpeg 3.4编写,已经很久没有更新了,支持的Android平台仅限于API 9~23,支持的iOS平台仅限于iOS 7.0~10.2.x。
综合以上的开源直播录制软件、开源流媒体服务器和开源音视频播放器,即可搭建完整的直播系统,该系统的效果图详见之前的文章《利用RTMP协议构建电脑与手机的直播Demo》和《利用SRT协议构建手机APP的直播Demo》。

更多详细的FFmpeg开发知识参见《FFmpeg开发实战:从零基础到短视频上线》一书。

标签:FFmpeg,音视频,开源,直播,RTMP,SRT,软件架构
From: https://blog.51cto.com/u_15067275/11875655

相关文章

  • POA:已开源,蚂蚁集团提出同时预训练多种尺寸网络的自监督范式 | ECCV 2024
    论文提出一种新颖的POA自监督学习范式,通过弹性分支设计允许同时对多种尺寸的模型进行预训练。POA可以直接从预训练teacher生成不同尺寸的模型,并且这些模型可以直接用于下游任务而无需额外的预训练。这个优势显著提高了部署灵活性,并有助于预训练的模型在各种视觉任务中取得SOTA结......
  • Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点OkDownload是一个为Android平台设计的开源下载框架,它支持多线程下载、多任务处理、断点续传等功能,并且具有可靠性、灵活性和高性能的特点。这个库是FileDownloader的升级......
  • .NET 开源报表神器 Seal-Report
    前言Seal-Report是一款.NET开源报表工具,拥有1.4KStar。它提供了一个完整的框架,使用C#编写,最新的版本采用的是.NET8.0。它能够高效地从各种数据库或NoSQL数据源生成日常报表,并支持执行复杂的报表任务。其简单易用的安装过程和直观的设计界面,我们能够在几分钟内创建并......
  • 每天分享一个FPGA开源代码(1)- spi
    1、SPI总线进行通信的结构 SPI总线主要包括四根关键信号线:(1)SCK(SerialClock)串行时钟线,由主设备产生,控制数据传输的速率和时机。(2)MOSI(MasterOutSlaveIn)主设备数据输出线,数据由主设备发送给从设备。(3)MISO(MasterInSlaveOut)从设备数据输出线,数据由从设备发......
  • .NET 开源实时监控系统 - WatchDog
    目录前言项目介绍功能特点项目技术栈工作原理1、支持.NET版本2、下载源码安装与配置1、WatchDog安装2、WatchDog服务注册3、添加异常记录器4、设置自动清除日志(可选)5、设置日志记录到外部数据库(可选)6、设置访问日志的账号密码7、配置说明和示例8、记录消息/......
  • 三分钟总结开源流程表单的优势特点
    实现流程化办公,可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品,低代码技术平台凭借够灵活、好操作、可视化界面的优势特点,得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程表单的优势特点,一起了解它为何能助力企业......
  • Miaoo朋友圈程序全开源版源码
    Miaoo朋友圈程序全开源版源码探索开源之美:Miaoo朋友圈程序全开源版源码深度解析在这个信息**的时代,社交媒体平台如雨后春笋般涌现,它们不仅改变了我们交流的方式,也深刻影响了我们的生活方式。小红书,这个集社交与电商于一体的平台,已经成为了无数人分享生活、发现美好的新天......
  • 科普文:软件架构数据库系列之【MySQL存储引擎InnoDB】
    概叙科普文:软件架构数据库系列之【MySQL前世今生及其体系结构概叙】-CSDN博客前面我们梳理了MySQL体系结构,涉及到innodb的并未进行详细说明,故在此文中进行补充说明。为了更好的理解Innodb,这里还是和前面MySQL体系结构一文中一样,保持一样的结构。重复的章节就不再描述,重点描......
  • 校园小情书微信小程序源码 | 社区小程序前后端开源 | 校园表白墙交友小程序
    校园小情书微信小程序源码 | 社区小程序前后端开源 | 校园表白墙交友小程序【校园小情书】——用代码编织的青春告白在这个数字化的时代,我们的情感表达也逐渐从纸笔转向了屏幕。小红书上的小伙伴们,你们是否也曾幻想过,在校园的某个角落,有一个属于自己的表白墙,可以匿名或实......
  • 利用通义灵码实现我的第一次开源贡献
    作者:重庆邮电大学计算机学院李逸雄结缘开源最早了解开源是从学校的兴趣组织开始的。2023年10月21日,openSUSE亚洲峰会在我们学校召开,这次会议汇聚了许多来自openSUSE社区贡献者以及对开源感兴趣的爱好者们。我第一次知道有这么多志同道合的爱好者在进行开源贡献,他们以个......