设计一个像ESPN一样的实时视频流系统

news2024/11/18 19:55:03

功能需求

•直播事件与流之间的最大延迟不超过1分钟•系统应能够适应大量用户(异构交付)•系统应能将视频转换为不同的分辨率和编解码器•系统应具备容错性

视频转换和接收

由于我们正在实时直播整个事件,因此我们不能等待整个视频结束后再开始将其转换为不同的格式和编解码器。为了实现这一点,我们可以使用一种名为RTMP(Real-Time Messaging Protocol)的协议。

•RTMP代表实时消息传输协议(Real-Time Messaging Protocol)•我们使用RTMP是因为它是基于TCP的,因此不会丢失数据,更加可靠。我们需要使用TCP,因为我们不希望在传输过程中丢失数据包。如果我们使用UDP之类的协议,虽然传输速度会更快,但在每个阶段丢失数据将导致视频质量下降。

所需组件

•转换服务:RTMP提供视频流,转换服务将该视频流转换为不同的编解码器和分辨率。它还具有作业调度器,以原始视频流为输入,将其转换为所有的分辨率和编解码器。多个工作节点执行这些任务。当有新的原始视频流时,转换服务将其推送到消息队列。工作节点订阅此消息队列。它们接受输入,并在视频转换完成后将其推送到另一个消息队列。•数据库:为了在发生灾难时不丢失视频数据(我们需要容错性),我们将使用数据库存储原始视频数据。•分布式文件服务:在工作节点处理视频后,还需要将结果存储在文件服务中以实现容错性。•消息队列

架构图

79709e914b8352d5f76def6bca275658.jpeg

向终端用户传输视频

我们将使用内容交付网络(CDN)将视频传输给终端用户。CDN或边缘服务器在地理上更接近终端用户。

由于用户将通过HTTP连接,因此我们可以使用诸如HLS(HTTP Live Streaming)(用于iPhone)或DASH(Dynamic Adaptive Streaming over HTTP)(用于其他操作系统)的协议。

但是,为什么我们要使用HLS/DASH?

HLS/DASH具有自适应比特率。这意味着我们将根据以下因素调整比特率:

•可提供的视频质量•网络速度•客户设备支持的分辨率和格式

由于它是一种流媒体协

议,它可以根据带宽的使用情况和实时需求来合理地进行调整。

注意:与RTMP相比,HLS/DASH是较低质量的连接,因此我们在实时性和质量之间进行了权衡。

为了将视频发送到CDN,我们可以在全球范围内部署服务器。我们将处理后的视频发送到这些服务器,然后服务器将其发送到CDN。

我们将使用RTMP将视频发送到服务器。

但是,为什么我们不直接将处理后的视频发送到CDN?

跨内容交付网络的传播速度可能不太高。因此,如果我们将处理后的视频发送到CDN,而它们在不同位置拥有服务器,则SLA保证可能无法与实时直播保证相匹配。

每当客户端请求视频时,其中一个服务器将客户端引导到CDN上的一个端点。客户端可以使用此端点来获取视频。

缓存

我们将让CDN负责缓存视频。尽管您可以将热门视频片段缓存在内存中,但为了减轻服务器负载,我们可以缓存客户端 <-> 终点的映射。这样,我们可以直接获取终点,而无需每次重新路由。

ded11b3c3fac91373441d4026b20605f.jpeg

容错性

为了使我们的系统更具容错性,我们可以使用负载均衡器。如果其中一个服务器离线,我们可以将请求重定向到其他服务器。

折衷方案

•使用WebRTC与使用HLS/DASH进行视频传输。HLS/DASH是基于HTTP并通过TCP工作的。它们保持有序传输。另一方面,WebRTC基于点对点,并通过UDP工作。它可能还会发送无序的数据块。由于我们希望保持视频质量,因此我们将使用HLS/DASH。

所需组件

•内容交付网络(CDN)•在不同位置的服务器

架构图

58b7def242b78c1d9f584d03fc32b3db.jpeg

容量估算

每个直播流需要处理多少个视频?

假设:

•捕捉的视频为8k。•我们要提供的分辨率:1080p、720p、480p和360p。•编解码器数量:4•板球比赛持续时间:10小时•视频大小:10GB

720p视频大小:10/2 = 5GB

480p视频大小:10/4 = 2.5GB

360p视频大小:10/8 = 1.25GB

所有分辨率所需的总存储空间:18.75GB

所有分辨率和编解码器所

需的总存储空间:18.75 * 4 = 75GB

在单个直播流中需要向CDN传输多少数据?

假设:

•用户数量:10,000,000•使用高清分辨率的用户比例:50%•观看直播流的用户比例:50%

标准分辨率下的视频大小:10/4 = 2.5GB

因此,总数据传输量 = SUM(视频类型的大小 * 类型的用户数量) * 平均观看百分比

= (10 GB * 50/100 * 10⁶ + 2.5 GB * 50/100 * 10⁶) * 50/100 = 3.125 * 1000000GB = 3.125 PB

从事件到用户设备传输数据需要多长时间?

假设:

•用户每秒消耗的数据量 = 10GB / 10小时 = 300 kB/sec•将300kB数据传输到最近的CDN所需时间 = 1秒•从CDN向用户传输300kB数据所需时间 = 150毫秒

总传输时间 = 1秒 + 0.15秒 + 0.15秒 = 1.3秒

假设ffmpeg运行速度为视频速度的2倍,处理时间为1 / 2 = 0.5秒

总延迟时间 = 1.3秒 + 0.5秒 = 1.8秒

通过以上内容,我们设计了一个类似ESPN的实时视频流系统,该系统具备容错性、支持不同分辨率和编解码器的视频转换,以及使用CDN进行视频传输。我们还进行了容量估算,估计了处理视频、传输数据和传输延迟所需的时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式ID-Leaf

目录 一&#xff0c;背景二&#xff0c;ID生成方案1&#xff0c;UUID2&#xff0c;类snowflake方案3&#xff0c;号段模式4&#xff0c;基于Redis模式5&#xff0c;数据库自增ID 三&#xff0c;Leaf Segment1&#xff0c;拉取源码2&#xff0c;修改配置并创建号段表3&#xff0…

FM实现F4帮助系列三:弹出框多筛选条件的搜索帮助(根据搜索帮助筛选字段)...

函数&#xff1a;F4IF_GET_SHLP_DESCR F4IF_START_VALUE_REQUEST 效果图&#xff1a; 本例子代码&#xff1a; 找到需要的帮助: *& Report ZLM_TEST_045 REPORT zlm_test_045. TABLES makt. DATA: BEGIN OF str_f4, matnr TYPE matnr, maktx TYPE maktx, END OF str_f4.…

【JavaEE初阶】前端第四节.JavaScript入门学习笔记

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;Java测试开发 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 前言 一、…

反馈体系

&#xff08;1&#xff09;引子 我前段时间看了一个小短视频&#xff0c;有主持人问马斯克&#xff1a;你最害怕什么&#xff1f; 马斯克想了很久&#xff0c;回答&#xff1a;我最害怕反馈机制失灵。 马斯克说的不是特斯拉汽车的反馈机制失灵&#xff08;虽然特斯拉汽车上装了…

Office Visio 2010安装

哈喽&#xff0c;大家好。今天一起学习的是Visio 2010的安装&#xff0c;这是一个绘制流程图的软件&#xff0c;用有效的绘图表达信息&#xff0c;比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂…

Java程序设计入门教程-- if 条件语句

目录 单分支选择语句&#xff08;if&#xff09; 双分支选择语句&#xff08;if…else&#xff09; 嵌套if语句 单分支选择语句&#xff08;if&#xff09; 情形 当判断条件满足时&#xff0c;执行语句体S&#xff0c;而不满足则什么都不做。 格式 if &#xff08;条件判断表…

Web3:实质、本质和棒喝

本文的名称可能让人困惑&#xff0c;实质和本质不一样吗&#xff1f;棒喝又是个什么。 什么是实质、本质和棒喝 如果不是很计较的话&#xff0c;“实质”和“本质”其实差不多。但在这篇文章里&#xff0c;略有区别。 “实质”是说一个东西原原本本是个什么东西。 “本质”是一…

刚刚,吴恩达 ChatGPT 新课三连发!

你有没有想过&#xff0c;你可以自己构建一个AI系统&#xff0c;或者开发一个使用大语言模型&#xff08;LLM&#xff09;的应用&#xff0c;甚至理解并创建扩散模型&#xff1f;我在吴恩达的三门新课程中找到了答案&#xff0c;这些课程让我看到了AI的无限可能性。 好消息&…

Neo4j图数据库介绍及简单入门

文章目录 Neo4j图数据库介绍Neo4j数据库安装可视化例子Neo4j增删改查增删改查 Neo4j图数据库介绍 电影里有这样的片段&#xff0c;警察抓捕凶手时&#xff0c;在墙上会画一个图&#xff1a; 这里也有一个demo可以让我们看到一个做好的图数据库&#xff1a; 这个demo也是用Neo4…

前端基础几大件

文章目录 HTMLCSSJavaScriptAjaxAxios&#xff08;第三方库&#xff0c;专门用于请求数据&#xff09;SpringBoot单例模式与前端异步请求 HTML 在HTML当中&#xff0c;一切都是节点Object&#xff1a;&#xff08;非常重要&#xff09; 整个Html文档就是一个DOM文档节点。所有…

26 strcpy 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 字符串的复制 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 strcpy, s…

推进印度制造受挫,苹果仍踢出13家中国企业,一条道走到黑?

苹果公布了2022年的供应商名单&#xff0c;让人惊讶的是苹果将13家中国供应商踢出了供应链&#xff0c;而美国、日本的供应商却有所增加&#xff0c;似乎苹果仍然在降低对中国制造的依赖&#xff0c;这对于苹果来说未必是好事。 一、苹果的印度制造计划受挫 数年前苹果推动印度…

深度学习在金融领域的十大应用算法【附Python代码】

引言 随着金融数据的不断增长和复杂化&#xff0c;传统的统计方法和机器学习技术面临着挑战。深度学习算法通过多层神经网络的构建&#xff0c;以及大规模数据的训练和优化&#xff0c;可以从数据中提取更加丰富、高级的特征表示&#xff0c;从而提供更准确、更稳定的预测和决策…

chatgpt赋能python:如何用Python创建一个九宫格

如何用Python创建一个九宫格 作为一种流行的编程语言&#xff0c;Python可以用于各种各样的项目。这篇文章将介绍如何使用Python创建一个九宫格布局&#xff0c;并展示如何在网页优化&#xff08;SEO&#xff09;中使用它。在本文中&#xff0c;我们将使用Python 3和Flask框架…

如何衡量客户对产品的推荐意愿?

如何衡量客户对产品的推荐意愿&#xff1f;净推荐值 趣讲大白话&#xff1a;衡量客户对你好不好 【趣讲信息科技184期】 **************************** 净推荐值(Net Promoter Score,简称NPS)是一种衡量客户忠诚度和推荐意愿的指标。 净推荐值的计算公式为&#xff1a; NPS (…

flex+margin布局方法

方式&#xff1a;【具体代码1】 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"…

全志V3S嵌入式驱动开发(串口驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 全志V3S支持三个串口&#xff0c;但是因为其中UART1的pin和其他功能是复用的&#xff0c;所以这个时候一般只用UART0和UART2。当然我们在linux开发…

Hive---5、分区表和分桶表

1、分区表和分桶表 1.1 分区表 Hive中的分区就是把一张大表的数据按照业务需求分散的存储到多个目录&#xff0c;每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区&#xff0c;这样的查询效率会提高很多。 1.1.1 分区表基本语法 1、创建…

scratch舞蹈演出 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年5月

目录 scratch舞蹈演出 一、题目要求 1、准备工作 2、功能实现 二、案例分析

Spring MVC的高级功能(异常处理器,拦截器,文件操作)

目录&#xff1a; 异常处理拦截器文件上传和下载 1.异常处理&#xff08;简单异常处理&#xff0c;自定义异常处理&#xff0c;异常处理注解&#xff09; 简单异常处理器 HandlerExceptionResolver接口 如果希望对Spring MVC中所有异常进行统一处理&#xff0c;可以使用S…