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

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

一、直播系统的概念结构

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

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

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

二、直播系统的软件架构

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

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

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开发实战:从零基础到短视频上线》一书。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容