Web 多媒体入门 | 青训营笔记

134 阅读5分钟

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

Web 多媒体历史

浏览器和 Web 的概念刚刚出现的时候,没有任何多媒体。很快,图像开始加入,但是充其量是穷人的多媒体。虽然随着 GIF 动画的出现,这些图像可以成为动画,但是这些动画完全是非交互性的。即使在音频和视频文件出现时,互联网技术在 Web 上传递这些文件的能力也很有限。互联网连接很慢,而音频和视频文件很大,没有人希望等待大文件的下载。文件下载之后,也必须使用独立于 Web 浏览器的外部播放器来查看内容。

互联网连接速度的飞速提高带来了更快地在 Web 上发送多媒体的能力,Web 浏览器技术也同样快速进步,自然地推出了现在称之为原生多媒体的技术。

基本上 Web 多媒体可以分为两个大的阶段,第一个阶段是以 PC 为主的时代,这个时代浏览器基本上是不支持音频和视频的,但浏览图片和文字是没有问题的。那个时候浏览器是不能实现音视频播放的,音视频播放基本上基于第三方插件,最主要的代表就是 Flash 播放器。后来到了移动互联网时代,慢慢的 Flash 就被淘汰了,其中有一个标志性的事件,就是 iPhone 手机出现之后,宣告不支持 Flash,从这儿开始,Flash 就开始走下坡路。那既然移动端它不支持 flash,那怎么播音视频呢?慢慢地,推出了一个新的标准 HTML5,新的标准原生支持音视频播放。但是后来大家发现原生标签它的功能实在是太有限了。而且还有其他的问题比如 video 标签复制这个视频的地址之后,所有的事情都是浏览器接管了,比如数据的请求、请求状态,包括这些错误状态,我们都拿不到的,那这个时候怎么办好?W3C 组织也意识到了这个问题,所以就推出了 Media Source Extensions,相当于一个媒体资源拓展 API,基于这个 API 我们就可以实现多视频格式的播放。

 Flash                               HTML5

基础知识

编码格式

H.262/MPEG-2 主要应用于:数字电视;DVD、VCD光盘等。

H.264/AVC 各大视频网站 PC 端观看时基本都是 H.264 编码。

H.265/HEVC 手机端 4K 视频。

H.266/VVC VR视频、穿戴设备、8K视频。

图像基本概念

图像分辨率:

用于确定组成一副图像的像素数据,就是指在水平和垂直方向上图像所具有的像素个数。

图像深度:

图像深度是指存储每个像素所需要的比特数。图像深度决定了图像的每个像素可能的颜色数,或可能的灰度级数。例如,彩色图像每个像素用 R,G,B 三个分量表示,每个分量用 8 位,像素深度为 24 位,可以表示的颜色数目为 2 的 24 次方,既 16777216 个;一副单色图像存储每个像素需要 8bit,则图像的像素深度为 8位,最大灰度数目为 2 的 8 次方,既 256 个。

视频基本概念

分辨率:

每一帧的图像分辨率

帧率:

视频单位时间内包含的视频帧的数量

码率:

就是指视频单位时间内传输的数据量,一般我们用 kbps 来表示,即千位每秒。

视频帧分类

I帧

I 帧又称 帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码。

P帧

P 帧又称 帧间预测编码帧,需要参考前面的 I 帧或者 P 帧才能进行编码。

B帧

B 帧又称 双向预测编码帧,也就是 B 帧记录的是本帧与前后帧的差别。

GOP (group of picture)

两个 I 帧之间的间隔。

I 帧不能太多也不能太少。

为什么要编码?

一个时长 90 分钟、分辨率为:1920 * 1080、帧率为 30FPS 的电影,如果不进行编码:

  • 每一帧大小:1920 * 1080 * 24 / 8 = 6220800 Byte (5.9 M)
  • 视频大小:933 G

进行视频编码,主要就是为了视频的存储和传输。

视频编码需要处理的数据

视频编码就是去除和压缩冗余的部分。

空间冗余

同样颜色的像素块,只需记录一次然后不断重复。

时间冗余

不同帧相同的内容不需要重复存储。

编码冗余

使用 1 位 '0' 和 '1' 分别表示蓝色和白色而不用 24 位表示。

视觉冗余

去除人眼看不到的颜色,并不会影响观感。

编码数据处理流程

封装格式

封装格式:存储音视频、图片或者字幕信息的一种容器。

多媒体元素和扩展 API

<audio> 和 <video> 元素

<video> 元素

<audio> 元素

<audio> 和 <video> 元素方法

image.png image.png

<audio> 和 <video> 元素属性

image.png image.png

<audio> 和 <video> 元素事件

image.png image.png

<audio> 和 <video> 元素缺陷

  • 不支持直接播放 hls、flv 等视频格式
  • 视频资源的请求和加载无法通过代码控制
    • 分段加载(节约流量)
    • 清晰度无缝切换
    • 精确预加载

媒体源扩展 API (Media Source Extensions)

  • 无插件在 web 端播放流媒体
  • 支持播放 hls、flv、mp4 等格式视频
  • 可实现视频分段加载、清晰度无缝切换、自适应码率、精确预加载等。
image.png

demo

  1. 创建 mediaSource 实例
  2. 创建指向 mediaSource 的 URL
  3. 监听 sourceopen 事件
  4. 创建 sourceBuffer
  5. 向 sourceBuffer 中加入数据
  6. 监听 updateend 事件
image.png

MSE 播放流程

image.png

播放器播放流程

image.png

mp4 和 fmp4

mp4 的文件结构

image.png

fmp4 的文件结构

image.png

流媒体协议

image.png

HLS

HLS 全称是 HTTP Live Streaming,是一个由 Apple 公司提出的基于 HTTP 的媒体流传输协议,用于实时音视频流的传输。目前 HLS 协议被广泛的应用于视频点播和直播领域。

播放流程

image.png

应用场景

image.png