
常见色彩格式:



A:B:C)表示法



HSV 色彩空间还可以表示为类似于上述圆柱体的圆锥体
HSV 色彩空间还可以表示为类似于上述圆柱体的圆锥体,色相沿着圆柱体的外圆周变化,饱和度沿着从横截面的圆心的距离变化,明度沿着横截面到底面和顶面的距离而变化。这种用圆锥体来表示 HSV 色彩空间的方式可能更加精确,有些图像在 RGB 或者 YUV 的色彩模型中处理起来并不精准,可以将图像转换为 HSV 色彩空间,再进行处理,效果会更好。

色彩空间也叫色域,指某种表色模式用所能表达的颜色构成的范围区域。而这个范围,不同的标准支持的范围则不同。
老电视视频中物体在移动时会出现条纹的原因
相比逐行扫描,隔行扫描占用带宽比较小。扫描设备会交换扫描偶数行和奇数行,同一张图像要刷两次,所以就产生了条纹。
早期的显示器设备刷新率比较低,所以不太适合使用逐行扫描,一般都使用隔行扫描。在隔行扫描的时候,常见的分辨率描述是 720i、1080i,“i”就是 Interlaced。由于逐行扫描显示的刷新率的提高,使用者已经不会感觉到屏幕闪烁了。因此,逐行扫描越来越常见,即经常见到的 720p、1080p。
帧率(FrameRate),指一秒钟刷新的视频图像帧数(Frames Per Second),视频一秒钟可以刷新多少帧,取决于显示设备的刷新能力。不同时代的设备,不同场景的视频显示设备,刷新的能力也不同,所以针对不同的场景也出现了很多种标准。
常见标准的帧率:
为什么 NTSC 标准的分辨率都不是整除的帧率,分母都是 1001?
NTSC 制式的标准为了解决因为色度和亮度频率不同引起失真色差的问题,将频率降低千分之一,于是就看到了有零有整的帧率。
音频采集基本流程:先采集到模拟信号,然后通过 ADC(模数转换)将模拟信号转换成数字信号以后,再通过 PCM(Pulse Code Modulation)脉冲编码调制对连续变化的模拟信号进行采样、量化和编码转换成离散的数字信号,从而实现音频信号的采集。
PCM 文件就是未经封装的音频原始文件,或者叫做音频“裸数据”。不同的扬声器、耳机设备,甚至是声卡输出设备,对音频的裸数据支持的情况不一样,有的设备支持单精度浮点型数据、有的设备支持双精度浮点型数据、有的设备支持无符号型数据、有的设备支持有符号型数据。因为输出的数据类型的支持不同,所以 PCM 采样数据的格式在输出之前,需要转换一下。这些数据的格式通常称之为采样数据格式。
通常人耳能够听到的频率范围是在 20Hz ~ 20kHz 之间,为了保证音频不失真,音频的采样频率通常应该在 40kHz 以上,而理论上采样率大于 40kHz 的音频格式都可以称之为无损格式。
数字音频领域常用的采样率与对应的使用场景:
采集不同方位的声源,然后通过不同方位的扬声器播放出来就产生了不同的声道。

采样的位深度,也叫采样位深,它决定了声音的动态范围。常见的 16 位(16bit)可以记录大概 96 分贝(96dB)的动态范围,也可以理解为每一个比特大约可以记录 6dB 的声音。
位深度并不是越大越好,也不是越小越好,不同的场景有不同的应用。
通常为了高保真,会选择使用 32bit,甚至 64bit 来表示音频。而常规音频通话使用 16bit 来表示即可,当然条件有限的话,8bit 也可以,但它是底线,8bit 的音频表示,听起来有时候会比较模糊。
按照某种频率计算一定数据量的单位,常用的码率统计时间单位为秒,所以码率也就是一秒钟的数据量,通常用 bps(bits per second)来表示,也就是每秒钟有多少位数据。而平时所说的码率,可以简单理解为每秒钟存储或传输的编码压缩后的数据量。
音频的码率可以间接地表示音频的质量,一般高清格式的码率更高。
音频在传输和存储时,如果直接存储 PCM 音频数据的话,消耗的带宽或者存储空间会比较多,所以我们为了节省传输带宽或者存储,通常会选择对音频数据做编码压缩处理。
常见的音频编码有 AAC、MP3、AC-3、OPUS,个别地方还可能会使用 WMA,但是从兼容性来看,AAC 和 OPUS 更出众一些。目前 AAC 应用于众多音乐播放器和音乐格式封装中,OPUS 常见于语音通信中。
编码应用场景:
视频转码主要涉及编码压缩算法(Encoding)、格式封装操作 (Muxing)、数据传输 (如 RTMP、RTP)、格式解封装(Demuxing)、解码解压缩算法(Decoding)几方面的操作。这些操作需要一个共识的协定,所以通常音视频技术都会有固定的参考标准,如封装格式标准、编解码操作标准、传输协议标准等等。
将视频流、音频流写入到一个封装容器中之前,需要先弄清楚这个容器是否支持当前的视频流、音频流数据。
音频是连续的采样序列,而视频则是连续的图像序列,这些序列是有前后关系的。如,有一个 6 帧的连续视频图像,每一帧都是宽 100、高 100 的画幅,在每一帧的正中央都有一个字母在变化。遇到这种情况时,如果每一帧图像全都做传输或存储操作的话,占用的带宽或空间都会很大。

为了节省空间,可以来分析一下图像的规律。6 帧图像大范围是相同的,只有正中心的小部分内容是变化的,可以推论,刷新第一帧图像后,从第二帧开始,只要刷新正中心字母区域的内容即可。即局部更新,只需要逐步更新 A、B、C、D、E、F 的区域就可以,在传输内容的时候既节省带宽,又能在存储内容的时候节省画幅的数据存储空间。
在视频里不仅仅有内容的更新,还涉及内容位置的运动等变化,所以视频内容更新的算法会更复杂一些。在做视频压缩的时候,就拿前面的这个例子来说,需要有一个参考帧,这里参考的是第一帧,后面每一帧都参考前面一帧做了局部更新。而视频图像序列不能只做局部更新,因为里面的目标对象还会运动,所以不仅可以前向做参考,还有可以做双向参考的技术。在这个过程中就涉及了图像的类型,通常遇到的是这三类帧:I 帧、P 帧和 B 帧。
I 帧作为关键帧,仅由帧内预测的宏块组成。而 P 帧代表预测帧,通过使用已经编码的帧进行运动估计,B 帧(双向预测帧) 则可以参考自己前后出现的帧。如果比较 IBP 帧包所占空间大小的话,通常是 I 帧> P 帧> B 帧,所以适当地增加 B 帧可以减少视频流占用的带宽或者存储空间。
I、P、B 帧在视频解码显示时的顺序:

解码顺序是 1423756,但是显示顺序却是 1234。当编码中存在 B 帧的时候,因为解码需要双向参考帧,所以需要多缓存几帧作为参考数据,从而也就带来了一定的显示延迟。所以在实时直播场景下,参考标准中推荐的做法通常是不带 B 帧。
在视频编码时,因为图像的画面以及图像中对象运动的复杂程度比较高,为了保证清晰度,运动的图像组中通常也会包含更多的图像运动参考信息,所以压缩难度也提升了很多,压缩后的视频码率也就变得比常规图像更高一些,这个码率的波动通常时高时低,具有可变性,一般称之为可变码率(VBR)。
在有些直播场景下,因为一个传输信号通道中会携带多条流,为了确保多条流在同一个信号通道中互不干扰,一般会要求编码时采用恒定码率的方式(CBR)。但是如果采用 CBR 的话,画质往往会有一些损耗。
在容器格式的内部会存储音频、视频的数据,这些数据可以称之为视频流、音频流。音视频流在容器中的存储形式有两种,既可以交错式存储,也可以是不同类型的流单独存储在自己的连续区域。

MP4 格式是最常见的多媒体文件格式,其跨平台性、兼容性都很好。
MP4 格式标准为 ISO-14496 Part 12、ISO-14496 Part 14:
MP4 封装格式中,经常会遇到 moov box 和 mdat box。存储音频和视频数据的索引信息的是 moov box,音频和视频的索引信息在 moov 中分别存储在不同的 trak 里面。每个 trak 里面会保存对应的数据采样相关的索引信息。通过获得 moov 中的索引信息,才能从 mdat 中读取音视频数据。因此,MP4 文件中的 moov 信息是必不可少的。如果缺少 moov 信息,这个 MP4 文件将无法被成功打开。

在存储音视频数据的时候,如果是顺序读取音视频数据的话,当然就是音视频数据交错存储比较好,这样会给内存、硬盘或者网络节省很多开销。
如果音视频分开,单独存放在各自的区域的话,为了更好地做音视频同步,通常会读取一段视频帧数据,再读取一段音频采样数据,这样势必会不断跳跃式地读取硬盘中的数据,或者不断地发起网络请求,如果是 http 请求的话,会看到大量的 http range 请求,给网络开销与服务器并发造成很大的压力。