音视频基础概念
声音的表示
- 声音三要素:响度、音调、音色。
- 波形图的横坐标是时间,纵坐标是振幅,表示的是所有频率叠加的正弦波振幅的总大小随时间的变化规律。
- 频谱图则是在这个立体模型的时间轴上进行切片,形成的以横坐标为频率,纵坐标为幅值的图形。它表示的是一个静态的时间点上,各频率正弦波的幅值大小的分布状况。
- 响度级既考虑了声音的物理效应,又考虑了人耳的听觉生理效应,表示人耳对声音的主观评价。我们日常所说的分贝指的是声压级。
- 两个音符间若相差一倍的频率,则我们称两者之间相差一个八度。
- 声音的数字化过程是将模拟信号(连续时间信号)转化为数字信号(离散时间信号)的过程,包括3个步骤:采样,量化,编码。
- 经过数字化处理后的数字音频包含如下三要素:采样率、量化位深、声道数。
- 数字信号由模拟信号采样而来,如果满足采样定理,数字信号就可以完全恢复原始的模拟信号。
- 为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。一般实际应用中保证采样频率为信号最高频率的2.56~4倍。
- 要计算一个PCM音频流的码率需要数字音频的三要素信息即可:码率 = 采样率 × \times × 量化位深 × \times × 声道数。
- PCM是“Pulse Code Modulation”的缩写,意为脉冲编码调制。PCM是一种将模拟信号数字化的方法,将模拟信号分成若干个等间隔的时间段,对每个时间段内的模拟信号进行量化和采样,将其转换为数字信号。PCM信号的每一个采样值都用二进制数字来表示,可以方便地进行数字信号处理和传输。PCM编码器是一种将模拟信号转换为PCM数字信号的设备或软件。
- 由于 PCM 编码是无损编码,且广泛应用,所以我们通常可以认为音频的裸数据格式就是 PCM 的。但为了节省存储空间以及传输成本,通常我们会对音频 PCM 数据进行压缩,这也就是音频编码,比如 MP3、AAC、OPUS 都是我们常见的音频编码格式。
图像的表示
- YCbCr 是目前广泛应用于数字图像处理的颜色模型,JPEG、MPEG、DVD、摄影机、数字电视等都使用这一模型。因此一般俗称的 YUV 大多是指 YCbCr。
- 对坐标值的数字化称为采样,对颜色值的数字化称为量化。
- 单位距离线对数可以这样来理解:假设我们用交替的黑色和白色垂直线来构造一幅图像,如果一条线宽是 0.1 mm,每单位距离(mm)就有 5 个线对(10 条黑白交替的线)。
- 单位距离点数是印刷和出版业中常用的图像分辨率的度量。在美国,这一度量常用**每英寸点数(dpi)**来表示,比如,报纸用 75 dpi 的分辨率来印刷,书页用 2044 dpi 印刷。
- 单位距离像素数常用在电子设备上。比如我们常常会听到用**每英寸像素数(ppi)**来衡量显示屏的成像分辨率,比如 iPhone 4 使用 326 ppi 的屏幕,iPhone 13 Pro Max 则使用 458 ppi 的屏幕。
音频编码
-
对音频或视频进行编码最重要目的就是为了进行数据压缩,以此来降低数据传输和存储的成本。
-
信息压缩的方向:1)信源包含的符号出现概率的非均匀性,使得信源是可以被压缩的。 2)信源的相关性,使得信源是可以被压缩的。 3)人的感知对不同信源的敏感度不一样,使得信源是可以被压缩的。
-
对音频数据进行编码压缩,主要是寻找音频数据中的冗余信息对其进行压缩:1)时域冗余 2)频域冗余 3)听觉冗余
-
音频信号时域冗余表现在以下方面:
- 幅度分布的非均匀性
- 样值之间的相关性
- 信号周期之间的相关性
- 静止系数
- 长时自相关性
-
频域冗余表现为:
- 长时功率谱密度的非均匀性
- 语音特有的短时功率谱密度
-
利用人耳的频率特性灵敏度以及掩蔽效应,可以压缩数字音频的数据量:
- 将会被掩蔽的信号分量在传输之前就去除。
- 不理会可能被掩蔽的量化噪声。
- 将人耳不敏感的频率信号在数字化之前滤除。
注:人耳的掩蔽效应包括下面几种:最小可闻阈值,频率掩蔽效应,时域掩蔽效应
-
对音频进行编码常见的格式有:
- PCM,无压缩。一种将模拟信号的数字化方法,无损编码。
- WAV,无压缩。有多种实现方式,但是都不会进行压缩操作。其中一种实现就是在 PCM 数据格式的前面加上 44 字节,分别用来描述 PCM 的采样率、声道数、数据格式等信息。音质非常好,大量软件都支持。
- MP3,有损压缩。音质在 128 Kbps 以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
- AAC,有损压缩。在小于 128 Kbps 的码率下表现优异,并且多用于视频中的音频编码。
- OPUS,有损压缩。可以用比 MP3 更小的码率实现比 MP3 更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。适用于语音聊天的音频消息场景。
-
在处理PCM数据时,对于音频不同声道的数据,有两种不同的存储格式:交错格式(不同声道的数据交错排列),平坦格式(相同声道的数据聚集排列)。
-
AAC,英文全称 Advanced Audio Coding,是由 Fraunhofer IIS、杜比实验室、AT&T、Sony 等公司共同开发,在 1997 年推出的基于 MPEG-2 的有损数字音频压缩的专利音频编码标准。2000 年,MPEG-4 标准在原 AAC 的基础上加上了 LTP(Long Term Prediction)、PNS(Perceptual Noise Substitution)、SBR(Spectral Band Replication)、PS(Parametric Stereo)等技术,并提供了多种扩展工具。
-
音频对象类型(Audio Object Types)是最主要的标记编码器的方式
-
Audio Specific Config 的信息使得我们可以不用传输 AAC 比特流就能让解码器理解音频的相关信息,这对于编解码器协商期间的设置很有用
视频编码
-
以一路分辨率 720x1280(常说的 720P),帧率为 30 fps 的视频为例,如果不经过编码压缩,直接传输或存储原始的 RGB 数据,对应的码率是:
720 * 1280 * 3 * 8 * 30 = 632.8125 Mbps (宽 * 高 * 像素字节数 * 字节比特数 * 帧数)
。一分钟的时间所需要的数据量是:632.8125 Mbps * 60s = 4.63 GB
。 -
视频信息主要包括这几个方面的冗余:空间冗余、时间冗余、编码冗余、视觉冗余。
-
常见的视频编码格式有 3 个大的系列,分别由不同的组织主导制定:
- ISO-MPEG/ITU-T 系列:由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)和国际电传视讯联盟远程通信标准化组织(ITU-T)开发的系列编码标准。
- H.264,也被称为高级视频编码(Advanced Video Coding,简称 AVC),是一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。
- H.265,也被称为高效率视频编码(High Efficiency Video Coding,简称 HEVC),是 H.264 的继任者。HEVC 被认为不仅提升图像质量,同时也能达到 H.264 两倍的压缩率(等同于同样画面质量下比特率减少了 50%),可支持 4K 分辨率甚至到超高画质电视,最高分辨率可达到 8192×4320(8K 分辨率),这是目前发展的趋势。
- H.266,也被称为多功能视频编码(Versatile Video Coding,简称 VVC),是 H.265 的继任者。VVC 对 8K 超高清、屏幕、高动态和 360 度全景视频等新的视频类型以及自适应带宽和分辨率的流媒体和实时通信等应用有了更好的支持。根据最近的 JVET 官方主观测试结果,VVC 的平均编码性能相对 HEVC 的提高已经可以达到 49%。
- AOM 系列:前身是由 Google 主导的 VPx 系列的编码标准。后续由多家公司组件成立了开放媒体联盟(Alliance for Open Media,AOM)继续开发新的编码标准。
- VP8,是一个开放的图像压缩格式,最早由 On2 Technologiesis 开发,随后由 Google 发布。同时 Google 也发布了 VP8 编码的实做库:libvpx,以 BSD 授权条款的方式发布,随后也附加了专利使用权。而在经过一些争论之后,最终 VP8 的授权确认为一个开放源代码授权。
- VP9,是 Google 提供的开源的免费视频编码格式,是 VP8 的后续版本。
- AV1,Alliance for Open Media Video 1 是由 AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源、免版权费的视频编码格式,目标是解决 H.265 昂贵的专利费用和复杂的专利授权问题并成为新一代领先的免版权费的编码标准。此外,AV1 是 Google 制定的 VP9 标准的继任者,也是 H.265 强有力的竞争者。
- AVS 系列:AVS(Audio Video coding Standard)是中国具备自主知识产权的系列编码标准。
- AVS2,第二代数字音视频编解码技术标准(AVS2),其首要应用目标是超高清晰度视频,支持超高分辨率(4K 以上)、高动态范围视频的高效压缩。
- AVS3,AVS3 增加了对 8K 分辨率的支持,该技术将使用于中央广播电视总台 8K 超高清频道。
- ISO-MPEG/ITU-T 系列:由国际标准组织机构(ISO)下属的运动图象专家组(MPEG)和国际电传视讯联盟远程通信标准化组织(ITU-T)开发的系列编码标准。
-
H.264 中,句法元素可以分为『序列』、『图像』、『片』、『宏块』、『子宏块』五个层次。
-
编解码分为软编软解和硬编硬解:
- 软编/软解: CPU 处理。
- 硬编/硬解: 使用显卡 GPU、专用 SDP 等其它芯片硬件处理
-
H.264 编码的方式可以这样理解:在视频中,一段时间内相邻的图像的像素、亮度与色温的差别通常很小。所以没必要去对一段时间内的每一幅图像都进行完整一帧的编码,而是可以选取这段时间的第一帧图像进行完整编码,而下一幅图像只记录与第一帧完整编码图像的像素、亮度与色温等特征的差别即可,以此类推循环下去。
什么叫序列呢?上述的这段时间内图像变化不大的图像集就可以称之为一个序列。**序列可以理解为有相同特点的一段图像数据。**但是如果某个图像与之前的图像变换很大,很难参考之前的帧来生成新的帧,那么就结束上一个序列,开始下一个序列。重复上述做法,生成新的一段序列。
-
H.264 结构中,一幅视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由
16x16
的 YUV 数据组成。宏块是 H.264 编码的基本单位。在 H.264 协议内定义了三种帧,分别是 I 帧、B 帧与 P 帧。
-
I 帧,即帧内编码图像帧,不参考其他图像帧,只利用本帧的信息进行编码。
-
P 帧,即预测编码图像帧,利用之前的 I 帧或 P 帧,采用运动预测的方式进行帧间预测编码。
-
B 帧,即双向预测编码图像帧,提供最高的压缩比,它既需要之前的图像帧(I 帧或 P 帧),也需要后来的图像帧(P 帧),采用运动预测的方式进行帧间双向预测编码。
-
DTS、PTS 的概念如下所述:
- DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
- PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
-
**GOP(Group Of Pictures)是图像组的概念,它指的是视频编码序列中两个 I 帧之间的距离。**通常意义上的 GOP 由 I 帧开始,到下一个 I 帧之前的帧结束。严格意义上讲,这个 I 帧是一个 IDR 帧。
-
H.264 使用的是封闭 GOP(Closed GOP),即在一个 GOP 中所有帧的解码不依赖该 GOP 外的其他帧,除了第一帧必须是 I 帧,其他帧可以是 P 帧或 B 帧。
-
**IDR 帧全称叫做 Instantaneous Decoder Refresh,是 I 帧的一种。IDR 帧的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播。**I 帧有被跨帧参考的可能,但 IDR 帧不会。
-
H.264 采用的核心算法是『帧内压缩』(空间压缩)和『帧间压缩』(时间压缩),帧内压缩是生成 I 帧的算法,帧间压缩是生成 B 帧和 P 帧的算法。
-
H.264 的主要目标是为了有高的视频压缩比和良好的网络亲和性,为了达成这两个目标,H.264 的解决方案是将系统框架分为两个层面:『视频编码层面(VCL)』和『网络抽象层面(NAL)』。
-
在 H.265 中,帧间预测可采用单向和双向的参考图像来进行预测,包括类似 H.264 中分层 B 帧的预测结构。
-
H.265 仍然是基于块的视频编码,因此延续了环内去方块滤波的思路。在 TU/PU 块边界进行滤波,根据 MV、QP 等决定不同滤波强度。
-
H.265 中采用先进的基于上下文的自适应二进制算术编码(CABAC)进行熵编码,引入了并行处理架构(Slice/Tile、WPP),在速度、压缩率和内存占用等方面均得到了大幅改善。
-
大尺寸离散余弦变换是 H.265 视频编码标准中提升编码效率的重要技术之一。在 H.264 中仅采用了 4x4/8x8 的 DCT 变换。而在 H.265 中 DCT 变换的最大尺寸为 32x32,这种大尺寸变换单元的选择可以使编码器在处理高分辨率画面中经常出现平坦区域时能够更好地提高压缩率。
-
H.265 引入了新的帧间预测技术,包括运动信息融合技术(Merge)、先进的运动矢量预测技术(Advanced Motion Vector Predictor,AMVP)以及基于 Merge 的 Skip 模式。
-
H.266,也被称为**多功能视频编码(Versatile Video Coding,简称 VVC)**是最新一代视频编码标准。
-
相对于之前的 H.265/HEVC 和 H.264/AVC 视频编码标准,VVC 对 8K 超高清、屏幕、高动态和 360 度全景视频等新的视频类型以及自适应带宽和分辨率的流媒体和实时通信等应用有了更好的支持。
音视频格式
- MP4 也称为 MPEG-4 第 14 部分,是继承 MPEG-4 第 12 部分的 ISO 基础媒体文件格式并略作扩展而来,定义于标准 ISO/IEC 14496-14 中,是一种标准的数字多媒体容器格式。
- moov Box 可以说是 MP4 文件中最重要的 Box,一般播放器的实现都需要读取到 moov 的数据才能开始播放流程。
- 对于通过网络播放 MP4 视频的场景,都建议将视频处理为 moov 前置。
- 在直播领域,由于 RTMP 推流、HTTP-FLV 播放的整套方案低延时的特性,以及服务端普遍提供 HTTP Web 服务,能更广泛的兼容 HTTP-FLV,使得 FLV 仍然是大多数直播产品的首选流媒体格式。
- 为什么 AudioTagHeader 中已经有了音频的相关参数,还需要在这里来一个 AudioSpecificConfig 呢?这是因为当 SoundFormat 是 AAC 时,SoundType 需要设置为 1(立体声),SoundRate 需要设置为 4(44k Hz),但这并不说明文件中 AAC 编码的音频必须是 44k Hz 的立体声。播放器在处理 AAC 音频时,需要忽略 AudioTagHeader 中的音频参数,而使用 AudioSpecificConfig 的参数来初始化解码器。
- 在 FLV 的文件中,一般情况下 AudioSpecificConfig 只会出现一次,即第一个 Audio Tag。
- M3U 文件是一种纯文本文件,可以指定一个或多个多媒体文件的位置。它的设计初衷是为了播放音频文件,但后来越来越多的用于播放视频文件列表。而 M3U8 则是用 UTF-8 编码的 M3U。M3U、M3U8 文件都是苹果公司使用的 HLS(HTTP Live Streaming) 协议的基础。
- 在实际应用场景中,由于 HLS/M3U8/TS 这套方案在控制直播延时上不太理想,所以一般实时直播场景不会选择使用 M3U8 媒体格式。但是,对于直播回放这种场景,由于使用 M3U8/TS 这套方案能够在直播过程中就持续生成和存储切片,所以直播回放基本上都会选择 M3U8 媒体格式。
- 当 M3U8 文件作为主播放列表(Master Playlist)时,其包含的信息是同一个媒体资源的多路流资源列表。不同的流可能有着不同的码率,不同的格式,不同的分辨率。不同的流也可以指定不同语言的音频,不同视角的视频等等。
- TS 主要是用于传输流,它可以实时传输节目内容,这就要求从传输流的任一片段开始都是可以独立解码的,在直播中可以用到。**也正是因为 TS 任一切片开始都可以独立解码,所以它非常适合按切片的方式存储直播内容。**TS 流中不支持快进快退,这个需要从协议层来支持,比如 HLS 协议对相关的能力做了定义。
音视频协议
- RTMP 协议是 Real Time Message Protocol(实时信息传输协议)的缩写,它是由 Adobe 公司提出的一种应用层的协议,用来解决多媒体数据传输流的**多路复用(Multiplexing)和分包(Packetizing)**的问题。
- 由于协议设计对低延时、音视频同步等能力的良好支持,RTMP 是实时直播场景,尤其是在推流上行链路中,最常用的传输协议之一。
- 可以将大的消息(Message)数据分包成小的块(Chunk)通过网络来进行传输,这个也是 RTMP 能够实现降低延时的核心原因。
- KCP 能以比 TCP 浪费 10%-20% 带宽的代价,换取平均延迟降低 30%-40%,最大延迟降低 3 倍的传输速度。 KCP 是一层纯算法实现,并不负责底层协议(如 UDP)的收发,需要使用者自己定义下层数据包的发送方式,并以 callback 的方式提供给 KCP。包括时钟也需要外部传递进来,内部不会有任何一次系统调用。
- HLS 作为苹果公司提出的协议,在 iOS 客户端上得到了很好的支持,比如 AVPlayer 和 Safari 都支持对 HLS 流媒体的播放;再加上 M3U8/TS 封装格式可以在直播中持续处理和存储流媒体数据,所以直播回放通常都会选择 HLS 协议来实现。