流媒体技术之音视频基础知识
前言
本系列文章的目的主要是为了记录学习流媒体过程中的知识,尽量成体系的总结。但是由于流媒体技术所涉及的知识点过多且个人能力有限,系列文章不免存在问题以及更新慢的情况如有问题请邮件联系,谢谢~。
本章主要是从最基础的音视频知识开始,大多是网上公开的资源在总结,如果很熟悉了也可以跳过。
话不多说,Let’s Go。
什么是音视频
视频–你可以看得见什么
- 视频的基础概念:一组图片(或者称为帧)以特定运行速率的滚动。
音频–你可以听到什么
- 声音是指压力波通过空气或者任何其他介质(例如气体、液体或者固体)传播的震动。
- 人耳听觉范围(Hz 一秒中震动的次数):
- 次声波 |20Hz| 可听声波 |20kHz| 超声波
- 人耳听觉范围(Hz 一秒中震动的次数):
编解码 - 压缩数据
CODEC 是一种压缩或解压缩数字音频/视频的电子软件。 它将原始(未压缩的)数字音频/视频转换为压缩格式,反之亦然。
如果没有编解码会发生什么:我们打包数百万张图片到一个电影时,我们会获得一个很大的文件。
假如我们创建一个 1080x1920 (高 x 宽)的视频,每个像素有 3 bytes,每秒 24 帧(每秒播放 24 张图片,这些图片给我们 16,777,216 种不同的颜色),视频时长为 30 分钟。
toppf = 1080 * 1920 //每帧所有的像素点 cpp = 3 //每个像素的大小 tis = 30 * 60 //时长秒 fps = 24 //每秒帧数 required_storage = tis * fps * toppf * cpp
一个视频需要大约 250.28G 的存储空间,1.11Gbps 的带宽播放才能不卡顿。这就是我们为什么需要编解码的原因。
具体视频编解码技术学习可参考 digital_video_introduction
音频编码基础
声音的采集
了解音频编码首先要知道音频是如何采集的,存在哪些参数。
声音的三要素:
- 音调:音频的快慢 男生 –> 女生 –> 儿童(快)。
- 音量:震动的幅度。
- 音色:谐波。
声音的采集:
- 量化采样:对一段模拟音频进行数字量化采样转换为数字信号。
- 位深(采样大小):采样能表述的最大范围值。8bit 或 16bit。位深越大声音描述越好。
- 采样率:采样的频率就是采样率(1s 采样次数 8k、16K、32K、44.1K、48K)。
- 声道:单声道、双声道、多声道。
- PCM 数据:最常见的原始数字数据存储格式。
- PCM 数据大小:
采样大小 * 采样率 * 声道
。例如:采样率为 44.1 KHz,采样大小为 16bit,双声道的 PCM 编码 WAV 文件,它的码率为 44.1K _ 16 _ 2 = 1411.2Kb/s。
- PCM 数据大小:
- WAV 数据:既可以存储原始 PCM 数据,再 PCM 基础上加一个头信息。或者存储压缩数据。
信号遮蔽
信号遮蔽:现实中的声音为复合声音,例如对话中听到对方说话往往伴随着背景音,但是这些声音被对方的说话声遮蔽掉了,这就叫信号遮蔽。可以分为两种:
频域遮蔽;
图中静音门槛:低于这条曲线的均屏蔽忽略。
图中遮蔽源生成一条遮蔽曲线,将低于这个范围的均屏蔽。
时域遮蔽。
接近主声音前后的前遮蔽与后遮蔽。
音频编码类型
通常音频编码类型有两种:
- 消除冗余信息(有损压缩):消除次声波与超声波以及被遮蔽掉的音频信号。
- 无损压缩:针对人可以听到的声音数据进行无损压缩。
无损编码,熵编码:
- 哈夫曼编码。
- 算术编码。
- 香农编码。
音频编码过程
常见的音频编解码器
常见的编解码格式 OPUS、AAC、Ogg、Speex、iLBC、AMR、G.711 等。
AAC 在直播系统中应用比较广泛。
OPUS 是较新的音频编码器,WebRtc 默认使用 OPUS。
固话一般使用 G.711 系列,窄带音频。
各音频编码格式质量比较:
各音频编码格式实时性:
AAC 编码器介绍
AAC 最开始基于 MPEG-2 的音频编码技术,MPEG-4 标准出现后,AAC 重新集成了其特性,加入了 SBR 技术和 PS 技术。
- 目前常用的规格右 AAC LC、AAC HE V1、AAC HE V2。
- AAC LC(Low Complexity):低复杂度规格,码流是 128k,音质好。
- AAC HE:等于 AAC LC + SBR(Spectral Band Replication),核心思想是按音谱保存。低频编码保存主要成分,高频单独放大编码保存音质。码流在 64K 左右。
- AAC HE V2:等于 AAC LC + SBR + PS(Parametric Stereo)。核心思想是双声道中的声音存在某种相似性,只需寻出一个声道的全部信息,然后花很少的字节用参数描述另一个声道与它不同的地方。
规格关系如下图:
AAC 格式:
- ADIF(Audio Data Interchange Format):这种格式的特征是可以确定的找到这个音频数据的开始,只能从头开始解码,不能在音频数据流中间开始。这种格式常用在磁盘文件中。
- ADTS(Audio Data Transport Stream):这种格式的特征是每一帧都有一个同步字,所以可以在音频流的任何位置开始解码。它类似于数据流格式。
ADTS 结构:
视频编解码基础
基本要素
- 由一组图像组成:图像由像素组合而成,每个像素由 RGB 控制,整张图由多少像素点描述这就是分辨率。
- 位深:用多少位标识一个像素。例如 RGB888(24 位)、RGBA(32 位)。
- BGR:BMP 使用 BGR 格式,需要进行转换为 RGB 进行展示。
- 为了传输/占用更小的空间而被压缩。
- 最终在显示设备上展示(未压缩)。
- PPI(pixels per inch):一寸长的距离内放了多少像素点。PPI > 300 书与视网膜级别。
- DPI(Dots pen inch):每英寸的像素点数。
码流计算
分辨率:
- X 轴像素个数 * Y 轴像素个数;
- 常见宽高比 16:9、4:3,其他非标准宽高比需要转换。
- 360P/720P/1K/2K。
帧率:
- 每秒钟采集、播放图像的个数;
- 动画的帧率 25 帧/s;
- 常见的帧率 15 帧/s,30 帧/s,60 帧/s。
码率:视频文件在单位时间内使用的数据流量,例如 1Mbps。
- 未编码视频的 RGB 码流的大小:
- RGB 码流 = 分辨率(宽*高)x 3(Byte)x 帧率(25 帧)
- 未编码视频的 RGB 码流的大小:
Stride 跨距:内存中每行像素所占用的空间。为了内存对齐每行像素在内存中所占用的空间并不一定是图像的宽度。
Stride 就是这些扩展内容的名称,Stride 也被称作 Pitch,如果图像的每一行像素末尾拥有扩展内容,Stride 的值一定大于图像的宽度值。
比如分辨率 638x480 的 RGB24 图像,我们在内存处理的时候如果要以 16 字节对齐, 则 6383/16=119.625 不能整除,因此不能 16 字节对齐,我们需要在每行尾部填充 6 个字节。就是 (638+2->640), 6403/16=120。此时该图片的 stride 为 1920 字节。
图像的显示
- 图像大小等于显示区域的大小,正常显示;
- 因为往往图像大小与屏幕大小并不相等,往往与显示区域相比。
- 图像小于显示区域,需要进行拉伸、留白;
- 图像大于显示区域,需要进行缩小、截断。
由于视频帧相关信息比较多,包括存储格式 YUV、帧类型(I、P、B 等)、PTS 等各种信息,单独放到第二篇总结。
容器 - 整合音视频的地方
容器或称为封装格式描述了不同的数据元素和元数据是如何结合一起的。
一个文件包含了所有的流(有音频和视频),并且也提供了音视频同步和通用元数据同步的方式,比如标题、分辨率等等。通常我们可以通过文件的后缀来判断文件格式。