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

本文涉及的产品
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频资源包5000点
简介: 音视频技术广泛应用于直播系统,涵盖电视、电脑、手机直播等多种形式,并延伸至在线教育、医疗咨询和安全监控等领域。直播系统涉及实时编解码与传输,技术实现较复杂。从用户角度看,直播系统分为来源方和观看方,但在开发者视角下还需加入云平台作为中转。本文提出一套基于全开源软件的直播系统架构,分为三层:开源直播录制软件(如OBS Studio、RTMP Streamer),开源流媒体服务器(如SRS、ZLMediaKit),以及开源音视频播放器(如VLC media player、ExoPlayer)。这些组件共同构成一个高效、灵活且成本低廉的直播解决方案。

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

一、直播系统的概念结构

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

live-system1.png

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

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

二、直播系统的软件架构

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

live-system2.png

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

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

目录
相关文章
|
8天前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
45 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
9天前
|
Java 持续交付 微服务
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过具体案例分析,揭示了其如何助力企业应对业务复杂性、提升系统可维护性和可扩展性。文章首先概述了微服务的核心概念及其优势,随后详细阐述了实施微服务过程中的关键技术选型、服务拆分策略、容错机制以及持续集成/持续部署(CI/CD)的最佳实践。最后,通过一个真实世界的应用实例,展示了微服务架构在实际项目中的成功应用及其带来的显著成效。 ####
|
11天前
|
监控 持续交付 API
深入理解微服务架构:构建高效、可扩展的系统
【10月更文挑战第14天】深入理解微服务架构:构建高效、可扩展的系统
47 0
|
2天前
|
缓存 运维 监控
后端开发中的微服务架构实践与挑战#### 一、
【10月更文挑战第22天】 本文探讨了微服务架构在后端开发中的应用实践,深入剖析了其核心优势、常见挑战及应对策略。传统后端架构难以满足快速迭代与高可用性需求,而微服务通过服务拆分与独立部署,显著提升了系统的灵活性和可维护性。文章指出,实施微服务需关注服务划分的合理性、通信机制的选择及数据一致性等问题。以电商系统为例,详细阐述了微服务改造过程,包括用户、订单、商品等服务的拆分与交互。最终强调,微服务虽优势明显,但落地需谨慎规划,持续优化。 #### 二、
|
2天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
9 1
|
8天前
|
监控 API 开发者
后端开发中的微服务架构实践与优化
【10月更文挑战第17天】 本文深入探讨了微服务架构在后端开发中的应用及其优化策略。通过分析微服务的核心理念、设计原则及实际案例,揭示了如何构建高效、可扩展的微服务系统。文章强调了微服务架构对于提升系统灵活性、降低耦合度的重要性,并提供了实用的优化建议,帮助开发者更好地应对复杂业务场景下的挑战。
14 7
|
4天前
|
存储 数据管理 调度
HarmonyOS架构理解:揭开鸿蒙系统的神秘面纱
【10月更文挑战第21天】华为的鸿蒙系统(HarmonyOS)以其独特的分布式架构备受关注。该架构包括分布式软总线、分布式数据管理和分布式任务调度。分布式软总线实现设备间的无缝连接;分布式数据管理支持跨设备数据共享;分布式任务调度则实现跨设备任务协同。这些特性为开发者提供了强大的工具,助力智能设备的未来发展。
25 1
|
6天前
|
运维 监控 API
后端开发中的微服务架构实践与挑战####
【10月更文挑战第19天】 本文将深入浅出地探讨微服务架构在后端开发中的应用,通过实例解析其核心理念、优势所在,以及实施过程中可能遭遇的挑战与应对策略。不同于传统单体应用,微服务以其轻量级、灵活性和可扩展性受到青睐,但同时也带来了服务间的通信复杂性、数据一致性等问题。通过本篇文章,读者将对微服务架构有一个全面而深入的理解,为实际项目中的选型与实施提供参考。 ####
|
6天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
14 1
|
10天前
|
负载均衡 监控 API
后端开发中的微服务架构实践
【10月更文挑战第15天】 在当今的软件开发领域,微服务架构已成为一种流行的技术趋势。本文将探讨微服务架构的基本概念、优势以及在实际后端开发中的应用。我们将通过具体案例分析,了解如何设计和实现一个高效的微服务系统,以及如何应对在实施过程中可能遇到的挑战。
24 1

热门文章

最新文章