移动端直播相关技术总结

news2024/11/26 1:10:03

一、直播APP原理

二、直播APP架构

三、直播APP实现流程

四、流媒体开发

  1. 流媒体模块架构

  1. 流媒体相关基础知识

帧:每一帧代表一幅静止的图像

GOP:Group of Pictures,画面组,一个GOP就是一组连续的画面,很多帧的集合

码率:比特率,单位时间内视频或音频的数据量

帧率:每秒显示的图片数量,帧率越大,画面越流畅。帧率大于16人眼就会认为是连贯的

压缩比:压缩前的码率/压缩后码率

视频文件格式:文件的后缀,.wmv、.mp4、.mov、.avi

视频封装格式:存储视频信息的容器,流式封装(TS、FLV)、索引式封装(MP4、MOV、AVI)

五、直播基础知识、原理

1.音视频采集

1.1 音视频采集编码框架

AVFoundation:用于处理音频、视频和图像的捕获、播放、编辑和导出等功能,提供一套强大的API接口来操作这些视听数据。

1.2 音视频硬件设备

CCD:图像传感器,用于图像采集和处理的过程,把图像转换成电信号。

拾音器:声音传感器,用于声音采集和处理的过程,把声音转换成电信号。

音频采样数据:一般为PCM格式。

视频采样数据:一般为YUV或RGB格式。(YUV 主要用于视频压缩和传输,通过减少色度分量的采样来实现较好的压缩效果;而 RGB 主要用于图像处理和显示,能够准确表示每个像素的颜色。)

2.视频处理(美颜,水印)

视频处理原理:视频是通过GPU,一帧一帧渲染到屏幕上的,所以我们可以利用OpenGL ES,对视频帧进行各种加工,从而视频各种不同的效果。美颜和视频添加特效可以利用GPUImage这个框架实现的。

GPUImage:GPUImage是一个基于OpenGL ES的一个强大的图像/视频处理框架,封装好了各种滤镜同时也可以编写自定义的滤镜。

OpenGL:Open Graphics Library是个定义了一个跨编程语言、跨平台的编程接口的规格,它用于二维、三维图象。OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。

OpenGL ES:OpenGL for Embedded Systems是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。

3.视频编码解码

3.1 视频编码框架

FFmpeg:是一个跨平台的开源视频框架,能实现视频编码、解码、转码、串流、播放等丰富

的功能。其几乎支持包含了所有音视频编解码、封装格式以及播放协议。

x264:开源的高性能视频编码器,把视频原数据YUV编码压缩成H.264格式。

VideoToolbox:苹果自带的视频硬编解码API,在iOS8之后才开放。

AudioToolbox:苹果自带的音频硬编解码API,在iOS8之后才开放。

3.2 视频编码技术

视频压缩编码标准:对视频进行压缩或者解压缩的编码技术,如MPEG、H.264。

主要作用:将视频像素数据压缩成为视频码流,从而降低视频的数据量。如果视频不经过压缩

编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。

MPEG:它采用了帧间压缩,仅存储连续帧之间有差别的地方 ,从而达到较大的压缩比。

H.264/AVC:采用事先预测和与MPEG中的P-B帧一样的帧预测方法压缩,它可以根据需要产生适合网络情况传输的视频流,还有更高的压缩比,有更好的图像质量 。

MPEG和H.264对比:如果是从单个画面清晰度比较,MPEG4有优势;从动作连贯性上的清晰度,H.264有优势;H.264的算法较复杂,需要更多的处理器和内存资源。

H.265/HEVC:基于H.264,保留原来的某些技术,同时对一些相关的技术加以改进,以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。

H.265 是一种更为高效的编码标准,能够在同等画质效果下将内容的体积压缩得更小,传输时更快更省带宽。

H.264和H.265对比:H.265 相对于 H.264 在压缩效率和视频质量方面有较大的优势,尤其在高分辨率和大带宽环境下表现更为出色。然而,由于 H.265 存在处理复杂度和兼容性问题。

直播的数据,就是一组图片,包括I帧、P帧、B帧。

用户第一次观看的时候,播放器会到服务器寻找最近的I帧反馈给用户。

I帧:关键帧,保留一副完整的画面,解码时只需要本帧数据就可以完成。

P帧:差别帧,保留这一帧跟之前帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(P帧没有完整画面数据,只有与前一帧的画面差别的数据)

B帧:双向差别帧,保留的是本帧与前后帧的差别,解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时更加消耗CPU。

帧内压缩:当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息。帧内一般采用有损压缩算法。

帧间压缩:时间压缩,它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。

muxing(合成):将视频流、音频流甚至是字幕流封装到一个文件中(容器格式FLV、TS),作为一个信号进行传输。

3.3 音频编码技术

常见的音频编码格式:MP3、AAC、Speex、Opux等。

特点

MP3

AAC

Opus

压缩效率

中等

较高

非常高

音频质量

中等

较好

很好

支持比特率范围

较窄(中等、较高)

较窄(中等、较高)

广泛(低、中、高)

主要应用

音乐、广播等

各种音频应用

流媒体、视频会议

兼容性

非常高

相对较低

3.4 码率控制

多码率:观众所处的网络情况是非常复杂的,有可能是WiFi,有可能5G、4G、甚至3G,那么怎么满足多方需求呢?多定义几条线路,根据当前网络环境自定义码率。

例如:高清,标清,流畅等,指的就是各种码率。

3.5 视频封装格式

TS:一种流媒体封装格式,流媒体封装有一个好处,就是不需要加载索引再播放,大大减少了首次载入的延迟,如果片子比较长,mp4文件的索引相当大,影响用户体验。而且两个TS片段可以无缝拼接,播放器能连续播放。

FLV:一种流媒体封装格式,由于它形成的文件极小、加载速度极快,使得在线观看视频文件成为可能,因此FLV格式成为了当今主流视频格式。

4.推流

4.1 数据传输框架

librtmp:一个开源的 C 库,用于实现 RTMP协议的客户端功能,包括 RTMP 连接建立、握手过程、数据交互、音视频传输等。

4.2 流媒体数据传输协议

RTMP:Real-Time Messaging Protocol,实时消息传输协议,由Adobe公司开发,基于TCP

协议,用于对象、视频、音频的传输。

RTMP工作原理:

握手:客户端和服务器之间进行握手,以建立连接。握手过程中包括版本协商和密钥交换等步骤,确保双方能够正常通信。

建立流:客户端发送一个命令给服务器,请求建立一个流(Stream)。一个流可以包含一个或多个音视频轨道。

数据交互:客户端和服务器通过建立的流进行音视频数据的传输。RTMP 会将音视频数据分割成小的消息进行传输,每个消息包含一个时间戳和有效负载。

控制信息:RTMP 还支持发送控制信息,用于控制音视频的播放、暂停、快进等操作。这些控制信息被封装在特定的消息类型中,如 SetChunkSize、Play、Pause 等。

5.流媒体服务器

5.1 常用服务器

NGINX-RTMP:基于 Nginx 服务器的一个第三方模块,支持直播和点播。

Microsoft Azure Media Services:微软提供的云端流媒体解决方案。

腾讯云:云直播(Cloud Live)、点播(VOD)、直播连麦(RTC)。

5.2 数据分发

CDN:Content Delivery Network,内容分发网络,是一种分布式的网络架构,它将内容缓存到离用户最近的节点服务器上,可以帮助加速音视频内容的传输,减少加载时间,提高用户访问网站的响应速度和观看体验,另外CDN 还能分担源站点的负载压力,提高系统的可扩展性和稳定性。

CDN工作原理:代理服务器,相当于一个中介。例如:请求流媒体数据时

5.3 CDN链路

传统CND链路——树形网络拓扑:

Cache 系统是整个 CDN 系统中的成本所在,设计树形结构可以最大化的节省 Cache 系统的资本投入。因为只有中心节点需要保持所有的 Cache 副本,向下逐级减少,到了边缘节点只需要少量的热点 Cache 就可以命中大部分 CDN 访问请求,这样极大的降低了 CDN 网络的成本。

网状网络拓扑结构:

直播业务是流式业务,很少涉及到 Cache 系统,播完就可以释放掉存储资源,对于存储的投入相对非常低,而且不要求存储在所有节点中,只要保证数据可回溯即可。

用户的可选择链路变为:无向图的指定两点间的所有路径,数量非常大。

回源:当有用户访问某一个URL的时候,如果被解析到的那个CDN节点没有缓存响应的内容,或者是缓存已经到期,就会回源站去获取搜索。如果没有访问,那么CDN节点不会主动去源站拿。

带宽:在固定的时间可传输的数据总量, 比如64位、800MHz的前端总线,它的数据传输率就等于64bit×800MHz÷8(Byte)=6.4GB/s。

QoS:带宽管理,限制每一个组群的带宽,让有限的带宽发挥最大的效用。

集群、分布式、负载均衡:由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。解决大量并发访问服务问题。

6.拉流

6.1 RTMP

1>RTMP协议

RTMP协议是基于TCP长连接,既可推流又可以拉流的协议,地址是rtmp://开头的,并且推流地址和播放地址是一样的,高并发下可能会出现一些不稳定的问题,所以一般只用作直播源推流、推流到CDN等场景。

2>RTMP强制切片

强制切片也一定程度上保证了实时性,有一定的弱网抵抗能力,因为每个数据包都不会太大,当数据包校验失败时,重新发送的成本不会太大,但合并数据包需要CPU的性能消耗。

6.2 HTTP-FLV

1>HTTP-FLV协议

HTTP-FLV协议基于HTTP长连接,可以看作是RTMP的HTTP版本,与RTMP的工作原理相似,延迟为1-3s,比RTMP协议延迟略高,HTTP-FLV协议一般只用作客户端拉流观看。

2>HTTP-FLV播放

3>HTTP-FLV流媒体播放器

4>流行的方案:

6.3 HLS

1>HLS协议

HLS基于HTTP短连接,一般只用于拉流观看,但严格地说HLS协议并不是流式协议,工作原理是通过HTTP协议下载静态文件,HLS协议的文件由两部分组成,一是多个几秒长度的ts碎片视频文件,另一个是记录这些视频文件地址的m3u8索引文件,这些静态文件都是直接写入磁盘的。

HLS观看地址是以https://开头.m3u8结尾的,实际上这个地址就是索引文件地址,客户端获取到索引文件后,就可以下载对应的碎片视频并开始播放了,由于HLS协议实际上是通过HTTP协议请求文件的,且HLS相关文件是直接写入磁盘的,所以不需要特殊的流媒体服务软件,使用Nginx的HTTP服务就可以了,网页加入HLS的js插件就可以播放了。

苹果设备是原生支持HLS协议的,点播的情况,也就是普通网络视频观看的场景下,m3u8索引文件会记录所有的碎片视频文件地址。

2>点播场景

HLS在点播的情况下优势更加明显,由于HLS的相关文件是无状态的静态文件,且每个文件的大小是有限的,所以负载均衡、CDN加速的效果更佳明显,HLS的点播视频会比mp4、FLV的视频更快的播放出来,并且在加载中跳转视频也会更佳顺滑。

3>直播场景

直播的场景下,转码软件可以直接生成HLS相关文件到磁盘,客户端通过HTTP服务下载文件即可;另外可以在Nginx加入RTMP插件,转码软件以及RTMP协议推流到Nginx,再由Nginx生成HLS相关文件,第2种方案对于前期研发和后期对接直播CND的过度更加顺滑。

4>直播的HLS文件

直播场景下的HLS文件与点播有些不同,视频流数据每几秒会打包成一个以ts为后缀的碎片视频文件,每生成一个新的视频文件都会同步更新m3u8索引文件,且碎片视频文件的个数是有上限的,当达到上限后,默认将最旧的视频文件删除且更新m3u8索引文件所以在直播的场景下,客户端也需要不断定时重新获取m3u8索引文件。

5>HLS协议的优缺点

HLS由于要生成静态文件,延迟很大5-30s,也可能会有1分钟延迟。

HLS的直播优势是ts视频碎片文件可以一直保留不删除,不需要花额外的性能保存录像;直播转点播、录播都是更加简单的,只需要修改m3u8索引文件即可,不需要重新花费性能编解码。

6>二级索引

m3u8索引文件支持二级索引,就是高清、标清、流畅、等多个观看地址可以整合到一个索引文件中,播放器可以根据带宽自动切换不同的观看地址,很多网页播放器的“自动”也是因为这个。

7>缓解磁盘压力

由于HLS协议的视频文件、索引文件都是直接写入磁盘的,如果长时间且多个直播流同时处理,会造成磁盘写入压力过大,机械磁盘可能出现磁盘损坏,固态硬盘寿命衰减,最好挂载一段内存空间作为HLS相关文件的写入位置。

挂载一段内存空间作为写入位置

Linux命令:mount -t tmpfs -o size=10g tmpfs /data

把文件写入/data,即可写入内存,而非磁盘

重启数据会消失,但可以做一些定时保存的措施

6.4 WebRTC

1>WebRTC协议

WebRTC是一种点对点的视频/语音通话协议,基于UDP,建立通信后,会不断的以流式发送数据,延迟要比RTMP还要低1s内,再一些交互型较高的直播场景,例如直播带货。

2>WebRTC服务器

Webrtc地址一般是webrtc:/开头的,推流和拉流地址一般也是一样的,它是点对点的协议,用在直播中需要搭建WebRTC服务器。

例如:一个基于 WebRTC 协议实现多方实时通讯。

6.5 RTSP

RTSP实时流传输协议,定义了一对多应用程序如何有效地通过IP网络传送多媒体数据,一般用在摄像头、监控等硬件设备的实时视频流观看、推送上。

RTSP协议有诸多优点:TCP/UDP切换,支持推流/拉流,支持点播/直播,但是Web领域一般不使用RTSP,现代浏览器不支持播放。

7.解码

7.1 解封装

Demultiplexing(分离):将复合音视频流(容器格式FLV、TS)中的多个单独的音频、视频、字幕或其他媒体流分离出来各自进行解码的过程。

7.2 音频编码框架

FDK-AAC:出色的音频编解码器,PCM音频数据和AAC音频数据互转,高音质、低延迟。

7.3 解码方式对比

特点

硬解码

软解码

原理

利用专用的硬件解码器(GPU)

来解码视频数据

使用通用的软件算法(CPU)

来解码视频数据

性能

高性能,播放流畅

性能较低,在播放高分辨率、高比特率的视频时可能出现卡顿

解码速度

资源消耗

CPU占用低

CPU占用较高

兼容性

较差,受硬件平台限制

较好

适用场景

适用于资源有限的移动设备和嵌入式系统等

适用于处理能力较为强大的计算机或服务器等

8.播放

ijkplayer:基于FFmpeg开源多媒体框架的跨平台视频播放器。

简单易用;支持跨平台,良好的兼容性;支持多种音视频格式的解码和播放;编译配置可裁剪,方便控制安装包大小;支持硬件加速解码。

9.互动系统

IM:Instant Messaging,即时通讯,是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。

腾讯云WNS的IM及时消息推送服务。 

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

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

相关文章

腾讯Perfdog支持Windows PC端体验性能测试

一、背景 最近在做抖音的小玩法,其基于unity引擎,然后挂载到直播伴侣。以及Perfdog近期也支持了Windows的测试,所以做一个体验测试。 二、如何做 查看PC端的支持,目前是beat版本 选择或搜索自己需要的对应的程序,如…

Allegro172版本如何在联机模式下使用skill文件操作指导

Allegro172版本如何在Symphony模式下使用skill文件操作指导 在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图 这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件 如下图,当调用skill的时候就会出现…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异,文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来,一些新兴的文件传输工具受到了人们的关注,其中除了知名的Aspera之外,还有许多可靠安全的…

全志H616交叉编译,orangepi-zero2

文章目录 交叉编译是什么为什么需要交叉编译? 宿主机和目标机所需工具解压编译工具临时有效,配置环境变量(切换终端无效)永久有效,配置环境变量大功告成开始测试拷入文件测试结束 交叉编译是什么 交叉编译&#xff1a…

《Learning Combinatorial Optimization Algorithms over Graphs》阅读笔记

一.文章概述 本文提出将强化学习和图嵌入的组合以端到端地自动为图上组合优化问题设计贪心启发式算法,以避免设计传统算法所需要的大量专业知识和试错。学得的贪心策略行为类似增量构造解决方案的元算法,动作由解决方案当前状态上的图嵌入网络确定。作者…

『清安无别事-赠书01期』|〖测试设计思想〗

目录 🧡 内容简介 💛 作者简介 💖 本书内容|目录 💗 读后感想 💝 参与方式 购书传送门:测试设计思想购书传送门:测试设计思想购书传送门:测试设计思想 🧡 内容简介 …

Win10提醒事项如何打开?电脑上如何添加日程提醒?

有不少上班族表示自己在日常办公时,经常会忘记一些重要的事情,例如领导安排给自己的任务、会议安排、项目截止日期等。为了避免自己忘记工作事项,很多人都想要在电脑上设置提醒事项或添加日程提醒。那么Win10提醒事项如何打开呢?P…

LCS最大公共子序列 与 LIS最大递增子序列

LCS Largest Common Subsequence 最大公共子序列 /* Input s1 s2//两个字符串Output length//长度 ans//具体字母 */ #include<iostream> using namespace std; int main() {string s1,s2;cin>>s1>>s2;int dp[100][100]{0};//dp[i][j]表示s1取前i位&#x…

软件工程概述-架构师(三)

软件工程概述&#xff08;老版&#xff09; 软件开发生命周期&#xff1a; 软件定义时期&#xff1a;包括 可行性研究和详细需求分析过程&#xff0c;任务是软件工程必需完成的目标&#xff0c;具有可行问题分析、可行性研究、需求分析等。软件开发时期&#xff1a;软件的 设…

css浮动(为什么要清除浮动?清除浮动有哪几种方式?)

为什么要清除浮动&#xff1f; 清除浮动主要是为了清除浮动元素造成的影响&#xff0c;使浮动元素不会影响其后元素的布局 防止父元素高度塌陷&#xff1a;当元素浮动后&#xff0c;它会脱离一个标准文档流&#xff0c;不再占用原先的布局空间。如果一个父元素内只有浮动元素&a…

SpringBoot中优雅的实现隐私数据脱敏(提供Gitee源码)

前言&#xff1a;在实际项目开发中&#xff0c;可能会对一些用户的隐私信息进行脱敏操作&#xff0c;传统的方式很多都是用replace方法进行手动替换&#xff0c;这样会由很多冗余的代码并且后续也不好维护&#xff0c;本期就讲解一下如何在SpringBoot中优雅的通过序列化的方式去…

07 线程学习

一 qt线程角色 子线程完成与UI线程无关的工作,并且能够保持与UI线程通信 二 qt中线程 在QT中,对于 线程操作也是提供类(QThread)来进行封装,然后再学习该类的API接口 参数用途Header:#include qmake:QT += coreInherits:QObject //继承于QObject从官方文档可以看出,如果一…

每天一道leetcode:797. 所有可能的路径(图论中等深度优先遍历)

今日份题目&#xff1a; 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节…

[论文笔记]Glancing Transformer for Non-Autoregressive Neural Machine Translation

引言 这是论文Glancing Transformer for Non-Autoregressive Neural Machine Translation的笔记。 传统的非自回归文本生成速度较慢,因为需要给定之前的token来预测下一个token。但自回归模型虽然效率高,但性能没那么好。 这篇论文提出了Glancing Transformer,可以只需要一…

Verdi_traceX and autotrace

Verdi_traceX and autotrace Trace X From nWave/nTrace of from the Teporal Flow View. Show Paths on Flow ViewShow Paths on nWave 若Waveform中有X态&#xff0c;鼠标右键会有Trace X的选项&#xff1b; 会自动打开Temporal Flow View窗口&#xff0c;展示对应路径&am…

我的创作纪念日 — 嵌入式up(2023.8.15)

机缘 在2022年8月15日&#xff0c;开始了CSDN文章的编写&#xff0c;最初只想做一个知识的积累&#xff0c;毕竟对一个电子发烧友来说&#xff0c;很多东西都是迭代很快&#xff0c;且玩的次数不会很多&#xff0c;有些问题和一些解决方法&#xff0c;最好记录下来&#xff0c;…

分类预测 | MATLAB实现EVO-CNN多输入分类预测

分类预测 | MATLAB实现EVO-CNN多输入分类预测 目录 分类预测 | MATLAB实现EVO-CNN多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现EVO-CNN多输入分类预测 2.代码说明&#xff1a;量谷优化卷积神经网络的数据分类预测&#xff1a;要求于Matlab …

杭电多校 Shortest path 记忆化搜索

&#x1f468;‍&#x1f3eb; Shortest path 输入 4 7 114514 1919810 2147483648输出 3 19 20 31&#x1f351; 思路&#xff1a;用操作3 凑出 操作1 操作2 的前提条件&#xff0c;暴搜记忆化搜索 import java.io.*; import java.util.*;public class Main {static Buffer…

linux中的/dev/null

1.什么是/dev 在 Linux 上&#xff0c;从驱动程序到设备的所有内容都可以作为文件进行访问。/dev/ 是包含所有物理和虚拟设备的目录。例如&#xff0c;/dev/sda 可能是您的主硬盘驱动器&#xff0c;/dev/sdb 可能是您现在正在使用的笔记本驱动器的文件。这就是您在 Linux 中访问…

华为OD机试-考勤信息

代码实现 # coding: utf-8 import numpyclass Solution:def chuqinInfo(self, n, arrs):res []for i in range(n):arr arrs[i]count 0for s in arr:if str(s) absent:count 1if count > 1:res.append(False)continuefor i in range(len(arr) - 1):a arr[i]b arr[i …