多媒体直播技术 | 青训营笔记

156 阅读6分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

1.视频基本元素

(1) 基本概念

像素:通常表现为小方格,每个像素都有自己的颜色值 用RGB表示

RGB:R,G,B 分别从0到255

分辨率:纵横像素数量

码率/比特率:表示单位时间内传送bit数目,单位bps

高比特率需要更高的带宽支持,否则会卡顿;而太低比特率会造成视频过度压缩

FFMPEG TOOLS:

- ffmpeg:视频处理工具(截取/格式转换)

- ffplay:视频播放工具

- ffprobe:视频分析工具

帧/帧率

帧:视频/动画中每一张画面

帧率:每秒传输帧数 每秒帧数越多,画面越流畅qvq

(2) 视频数据的封装

通常是视频编码,音频编码后 一起进行封装

封装:就是将已经编码压缩好的视频轨和音频轨按照一定格式放到一个文件中(类比:盛饭的容器)

目前主要食品容器:MPG, VOB, MP4, 3GP, ASF, RMVB, WMV, MOV, FLV....

轨道/流

通常会有音频流/视频流/字幕流,但每一个流里不一定只有一个,比如:

他这里音频流里有多个,因为有的是按照语言分的。那英语流和法语也各有两个,其实是按照杜比7.1(环绕声道,但也需要设备支持)/5.1声道继续分。

 可以用 ↓ 来查看packet信息

ffprobe-show_packets xxxx.mp4

视频流、音频流数据相互交错排列,比如先一个video,再audio, 再video,再audio 形成混流 Pts: presentation timestamp

为什么要交错排列:

虽然视频和音频是独立存在的,但合并到视频文件后,我们的文件一般是顺序下载的,一个位置的音视频数据相隔太远会造成卡顿、音画不同步,也可以实现一边下载一边播

2. 视频压缩

不压缩文件会超级超级超级超级超级大(。•́^•̀。)

(1) YUV概念

颜色空间YUV: 视频主要采用YUV,而不是RGB,因为RGB不利于压缩,YUV还加入了亮度概念,因为人眼对亮度更敏感,对色度敏感度还好。

Y - Luma 亮度

U/V - Chroma 色度

通常Y会保留,而对U,V进行降采样(色彩可能会不那么艳丽啦)。

YUV 可以为我们节省超多的数据量!!!!!

(2) Gif 压缩 vs MP4 压缩

gif压缩才用了不一样的技术 利用视频画面的相关性减少数据量

帧内压缩(intraframe):也称为空间压缩。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,与静态图像压缩类似。

eg: 有一个老师在黑板写字的画面,衣服是白色的,那衣服的白色就算冗余信息(因为衣服像素占比都很多,一个小方块像素只要引用别的白色小方块像素就好了,而不用完整记录所有信息)

帧间压缩(Interframe):也称为时间压缩。是基于许多视频或动画的连续前后两帧具有很大的相关性(即连续的视频其相邻帧之间具有冗余信息)的特点来实现。

eg:比如一个gif 两个人在看一本书+交流,那背景基本是没变的,就可以进行帧间压缩(静止的地方就可以不进行数据的传输)。

(3) 帧的编码类型

I-frame: Intra-frame 帧内帧 - 不依赖于别的帧 只靠自己的帧重构完整图像 压缩比小 数据量大

P-frame: Predicted frame 前向预测帧 - 参考前面已编码的I帧和P帧 后面的帧只要把前面的叠加上去 就可以得到一个新的画面值但是因为传输只要记录差值 所以P帧压缩比相对比I帧高一点 但是必须要参考帧才能正确编解码

B-frame: (最常用)由于B帧可以参考和插入在它之前和之后发生的两个或多个帧,所以它可以显著降低帧的大小,同时保持食品质量。B帧能利用空间冗余和时间冗余(过去帧/未来帧),所以视频压缩超级常用。

通常在每个GOP,第一帧都是I帧。假如一个视频是每10秒一个GOP进行编码,如果拖动到第15秒是P帧,那P帧可能得依赖前面的GOP比如第10秒,先把第10秒解码出来,再在他的基础上解码第15秒的画面。

有的播放器可以是就算你拖到第15秒,我也从前一个GOP,第10秒开始播,这样可以做到快速响应。

(4) 帧的使用场景

- 视频点播:节省带宽/高压缩率 多用B帧

- 直播:低延迟,不用B帧

- 视频编辑:提高响应,个别会使用全I帧

(5) 编码格式

H264: AVC 广泛普及

H265: HEVC 逐渐推广

H266: VVC 未来可期hhh

压缩比越高的算法需要越高的算力支持

3. 视频推拉流协议

(1) 封装格式:MP4

Moov: Movie Box, 存储mp4 metadata,一般位于mp4文件的开头

Mvhd:Movie Header Box,mp4整体信息,比如创建时间、文件时长等

Trak:Track Box,一个mp4 包含的多个轨道(视频/音频轨道)

Stbl:Sample Table Box,包含这些媒体数据的索引和事件信息

(2) 封装格式:FLV(Flash Video)

FLV是二进制文件,由文件头和很多tag组成。

tag分成:audio/video/script, 音频流/视频流/脚本流(关键字/文件信息)

(3) CDN

建立并覆盖在internet之上,通过智能调度将用户请求到最接近用户的服务节点,降低用户访问延迟,提高可用性。

(4) 名词解释

点播:视频播放

直播看播:观众观看直播

推流:主播将数据发送到CDN网络

拉流:观众从CDN拉去直播数据

(5) 推拉流协议

橙色线比较常用

- RTMP:Real-Time Messaging Protocol 实时消息协议(推流协议)

优势:基于tcp/低延迟

劣势: 停止更新/没有支持H265/使用1935端口 被防火墙阻碍

- HTTP-FLV: HTTP+FLV (拉流协议)

是一种网络视频格式,用作流媒体格式

格式简单,便于分发;不转码的情况下直接转发即可,延迟较低

- HLS: HTTP Live Streaming (拉流协议-苹果公司)

把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流播放时,客户端可以选择从许多不同的备用源中以不同速率下载同样的资源,允许流媒体会画适应不同的数据速率。

4. 客户端工作流程

(1) 开播过程

图像处理: 美颜/绿幕转好看的背景/头饰

(2) 看播过程

音画同步通常在渲染阶段:

可能音频和视频解码速度不一样,但人对音频更敏感,所以我们要确保音频流畅播放,然后把视频的时间戳向音频对齐

安卓上面比较知名的播放器:

Google Exoplayer, Bilibili ijkplayer