音视频基础知识

音视频基础知识


视频基础

连续的图像快速变化上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫作视频。视频的播放过程可以简单理解为一帧一帧的画面按照时间顺序呈现出来的过程。


RGB 格式

RGB色彩模式是工业界的一种颜色标准,是通过对红、绿、蓝三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。而我们显示器能够直接显示的格式就是RGB格式
三原色分别是红® ,绿(G) ,蓝(B).任何颜色都可以通过按一定比例混合三原色组成。

每个色度成分通常用8bit表示[0,255] ,每个通道的位深越大,能够表示的颜色值就越大,比如现在高端显示器说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。102410241024约为10,7374万色=10亿色, 是8bit的64倍。常见的颜色还是8bit居多。

在这里插入图片描述


RGB常见格式

RGB16 主要数据格式有RGB556、RGB555

RGB556 每个像素用16位表示,其中RGB分别使用5、6、5位

RGB555 每个像素用16位表示,其中RGB分别使用5、5、5位表示其中多余的一位不用

RGB24 每个颜色用8BIT表示,RGB24是最常用的RGB像素格式

RGB32 RGB32图像每个像素用32BIT表示,占4个字节,R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留。在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA …

ARGB32(其中多余的8Bit来表示透明度(alpha))



所以,RGB24 真彩色可以表示的色彩:256256256 = 16,777,216 ,大约有1600多万像素。

比如一张1280×720的RGB24图像的大小如下:
1280×720 * 3 = 2.637 MB

而如果为一部120分钟的电影,则大小为:2.637 MB * 25帧 * 3600秒 * 2小时 = 474.66 GB


RGB排列

通常的图像像素是按RGB顺序进行排列,但有些图像处理要转成其他顺序,比如OpenCV经常转成BGR的排列方式。

在这里插入图片描述



YUV 格式

YUV格式主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视。它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。

与我们熟知RGB类似,YUV也是一种颜色编码方法,它是指将亮度参量(Y:Luminance或Luma)和色度参量(UV:Chrominance或Chroma)分开进行表示的像素编码格式。

这样分开的好处就是不但可以避免相互干扰,没有UV信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题;还可以降低色度的采样率而不会对图像质量影响太大,降低了视屏信号传输时对频宽(带宽)的要求。

其中“Y”表示亮度(Luminance或Luma),也称灰阶值 “U”和“V”表示的则是色度(Chrominance或Chroma)


YUV 格式种类

packed格式

packed的YUV格式,每个像素点的Y,U,V是连续交叉存储,每个像素点的Y、U、V分量交叉排列并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel)

在这里插入图片描述


planar 格式

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的 V。

在这里插入图片描述


YUV其余格式

YUV存在多种格式,比如YUV420p,YUV420sp等,不同的YUV格式的数据在存储时的排列顺序是不一样的,开发中必须非常注意,否则画面会显示不正常。比如花屏,绿屏等现象。

在这里插入图片描述

YUV444
类似与RGB一样的概念,一个像素由一个Y(亮度信息)和一个UV(色度信息)(一般UV成套出现)来表示. 一个像素大小如果为8BIT则为3个字节

YUV422
第一个Y对应一个UV,而第二个Y则与前一个Y的UV对应。即每两个亮度信息共用一个色度信息。

YUV420
每4个(不是连续的4个)上下2 * 2 的Y共用一个UV,就每4个亮度信息对应一个色度。 使用X264编码成H264必须为YUV420格式。


在这里插入图片描述

YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。


YUV4:2:0格式最为常用, 可以计算出其一个像素大小仅为1.5字节。
1.5 字节 = ( 4Y + 1U + 1V) / 4

与RGB24比起来,减少了一半的大小,只损失了少量色彩细节。


NV12格式

对应Ffmpeg像素表示AV_PIX_FMT_NV12,

在这里插入图片描述

其余格式

在这里插入图片描述


视频的一些概念


像素:一个图片的基本单位,pix是英语单词picture的简写,简称px。

码率:视频文件在单位时间内使用的数据流量。如 1Mbps。大多数情况下码率越高 分辨率越高,也就越清晰。

Stride:指在内存中每行像素所占的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度。

视频帧率:单位fps,通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,视觉体验就越流畅。

视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。

分辨率:就是常说的640x480分辨率、1920x1080分辨率,分辨率影响视频图像的大小。

编解码

视频就是一帧一帧的图片。一部120分钟的电影、25帧、1920*1080 分辨率,24位真彩色的视频,大小为 474.66 GB,一部电影就占满了磁盘了,更别说在网络上传输,因此必须对视频进行压缩,这种视频压缩技术就是编码。解码就是将编码的视频解压缩处理。

封装格式

封装格式指的是压缩过的视频数据和音频数据打包成一个文件的规范。如 mp4,flv,avi,mkv等。

音视频录制原理在这里插入图片描述

音视频播放原理

在这里插入图片描述



RGB 转换YUV

通常情况下RGB和YUV直接的相互转换都是调用接口实现,比如Ffmpeg的swscale或者libyuv库。

-主要转换标准是 BT601和BT709。

8bit位深的情况下
TV range是16-235(Y)、16-240(UV) ,也叫Limited Range
PC range是0-255,也叫Full Range
RGB没有range之分,全是0-255

RGB -> YUV转换公式

Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.169 * R - 0.331 * G + 0.5 * B
V = 0.5 * R - 0.419 * G - 0.081 * B

YUV -> RGB转换公式

R = Y+1.402 (V - 128)
G= Y - 0.34414 (U - 128) - 0.71414 (V - 128)
B= Y + 1.772 (U - 128)


解码失败播放时,为什么会绿屏?

因为解码失败时YUV分量都填为0值,然后根据公式:
●R= 1.402 *(-128) = -126.598
●G= -0.34414(-128) - 0.71414(-128) = 44.04992 + 91.40992 = 135.45984
●B= 1.772 *(-128) = -126.228

由颜色表示范围为0 ~ 255, 不存在负数,所以R分量和B分量取0

●R=0
●G= 135.45984
●B=0

此时只有G分量有值所以为绿色。


I、P、B 帧


视频中,一秒钟一般有25帧,但并不是每一帧的图像都是完整的画面,如果每一帧画面都是完整的图片,那么一个视频的体积就会很大,这样对于网络传输或者视频数据存储来说成本太高,所以通常会对视频流中的一部分画面进行压缩(编码)处理。由于压缩处理的方式不同,视频中的画面帧就分为了不同的类别,其中包括:I 帧、P 帧、B 帧。


I 帧(Intra coded frames):I 帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。I 帧使用帧内压缩,不使用运动补偿,由于 I 帧不依赖其它帧,所以是随机存取的入点,同时是解码的基准帧。I 帧主要用于接收机的初始化和信道的获取,以及节目的切换和插入,I 帧图像的压缩倍数相对较低。I 帧图像是周期性出现在图像序列中的,出现频率可由编码器选择。

P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P 帧图像中可以包含帧内编码的部分,即 P 帧中的每一个宏块可以是前向预测,也可以是帧内编码。

B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。值得注意的是,由于 B 帧图像采用了未来帧作为参考,因此 MPEG-2 编码码流中图像帧的传输顺序和显示顺序是不同的。


在这里插入图片描述
在这里插入图片描述

简单来说,I帧为基准帧率,I可以不依赖其他帧就解码出一幅完整的图像单独显示,而P帧 (预测帧) 和 B帧 (双向帧) 不能单独显示,P 帧需要依赖视频流中排在它前面的帧才能解码出图像。B 帧则需要依赖视频流中排在它前面或后面的帧才能解码出图像。

一般P帧的大小为I帧的二分之一 , B帧大小为I帧的四分之一。



GOP

GOP(group of pictures)

一个序列的第一个图像叫做IDR图像(立即刷新图像),IDR图像都是I帧图像。 在视频编码序列中,GOP即指两个IDR帧之间的距离。

GOP长度越大,视频压缩效率越高,但视频质量和视频流恢复能力也越差,反之亦然。

如果一秒25帧,一般gop设置为25, 50(一般是帧率的倍数)
如果不是直播流,B帧一 般设置2帧连续B帧,以降低码率。


Closed GOP & Open GOP

Closed GOP和Open GOP常见于视频流中,并影响压缩效率、视频容错能力以及ABR流的切换能力。
Closed GOP对GOP外部的帧是封闭的。一个属于Closed GOP的帧只能参考这个GOP之内的帧。

Open GOP与Closed GOP相反,Open GOP内部的帧可以参考其他GOP中的帧。


GOP 间隔

在这里插入图片描述

GOP越大,编码的I帧就会越少。相比而言,P帧、B帧的压缩率更高,因此整个视频的编码效率就会越高。但是GOP太大,也会导致IDR帧距离太大,点播场景时进行视频的seek操作就会不方便。


如果GOP间隔为5秒,那么如果此GOP内的I帧丢失了,则这五秒内画面就无法正常显示。
GOP 太短会导致码率上升,常见GOP 1秒 (25帧) 或者2秒(50帧) 一个 GOP



DTS PTS

◆DTS (Decoding Time Stamp,解码时间戳) :读入内存中的比特流在什么时候开始送入解码器中进行解码
◆PTS (Presentation Time Stamp,显示时间戳) :解码后的视频帧什么时候被显示

在这里插入图片描述
需要注意的是:虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。


当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,就回到了我们前面说的问题:解码顺序和播放顺序不一致了。

比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:

   PTS: 1 4 2 3
   DTS: 1 2 3 4
Stream: I P B B

引入B帧带来了解码延迟



宏块

H264默认是使用16X16大小的区域作为一个宏块,也可以划分成8X8大小。

划分好宏块后,计算宏块的象素值,以此类推,计算-幅图像中每个宏块的像素值,所有宏块都处理完后如图。

在这里插入图片描述

H264对比较平坦的图像使用16X16大小的宏块。但为了更高的压缩率,还可以在16X16的宏块上更划分出更小的子块。子块的大小可以是8X16. 16X8. 8X8. 4X8. 8X4. 4X4非常的灵活。

宏块越大,压缩效率越高,一般图像中,越精细的区域宏块越小,色彩大量冗余的区域宏块也越大。



视频压缩原理

编码的目的,就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的核心思想就是去除冗余信息。

空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。

时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余。

视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。

信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,它们之间的差距就是信息熵冗余,或称编码冗余。

知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。



H264 编码

对摄像头采集的每一帧视频需要进行编码,由与视频中存在空间和时间的冗余,需要用算法来去除这些冗余。H264是专门去除这些冗余的算法,我们把这种算法称为H264编码。

H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称
应用:像大多数看到的视频,rmvb avi mp4 flv 大都是由h264进行编码
当然也会有不同的如mpeg4v p9这样比较冷门的编码

无论是h264 mpeg4 vp9 都是基于宏块的方式进行编码,原理是-样的,只不过实现的算法不一样。



音频

声音是一种由物体振动引发的物理现象,如小提琴的弦声等。物体的振动使其四周空气的压强产生变化,这种忽强忽弱变化以波的形式向四周传播,当被人耳所接收时,我们就听见了声音。

在这里插入图片描述

声音的频率是周期的倒数,它表示的是声音在1秒钟内的周期数,单位是赫兹(Hz)。千赫(kHz),即1000Hz,表示每秒振动1000次。声音按频率可作如下划分:

  • 次声 0~20Hz
  • 人耳能听见的声音 20Hz~20KHz
  • 超声 20KHz~1GHz
  • 特超声 1GHz~10THz

PCM脉冲编码调制

PCM(Pulse Code Modulation),脉冲编码调制。人耳听到的是模拟信号,PCM是把声音从模拟信号转化为数字信号的技术。

原始的音频数据就是PCM格式,通过采样来的数据也是PCM格式


现实生活中我们听到的声音是连续的,但是在计算机中只能处理数字信号,不能处理模拟信号,所以我们只能通过采样的方式,把模拟信号转化成数字信号

在这里插入图片描述

Nyguist采样定律指定,带宽有限(band-limited) 采样频率大于2倍信号最高频率后可以无失真的恢复出原始信号。

人耳能听到的频率范围是[20H~20kHz],所以采样频率一般为44.1Khz,这样就能保证声音到达20Khz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。


采样频率

每秒钟的样本数也被称之为采样率(Sample rate)。

人耳能听到的频率范围是20HZ ~ 20kHz,所以采样频率一般为44.1Khz,这样就能保证声音到达20Khz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。

常用的采样频率:
22000(22kHz): FM。
44100(44.1kHz): CD。
48000(48kHz): 数字电视。
96000(96kHz): 蓝光,高清DVD。
192000(192kHz): 蓝光,高清DVD。



Quantization(量化)

采样值的精度取决于它用多少位来表示。
例如8位量化可以表示256个不同值,而16位量化可以表示范围为[-32768, 32767]。

量化处理过程,就是将时间连续的信号,处理成时间离散的信号,并用实数表示。这些实数将被转换为二进制数用于模拟信号的存储和传输。

8-bit:2^8 = 256 ,有256个状态可以用于衡量真实的模拟信号。
16-bit:2^16 = 65,536 ,有65,536个状态可以用于衡量真实的模拟信号。
24-bit:2^24 = 16,666,216 l,有16,666,216个状态可以用于衡量真实的模拟信号。

位深越大,对模拟信号的描述将越真实,对声音的描述更加准确。



音频的一些概念

采样精度(采样深度):每个“样本点”的大小,一般为8bit, 16bit,24bit。

Channel(通道数):单声道,双声道,四声道,5.1声道。

一般双声道的音频大小是单声道的两倍。

一个采样频率44100hz,采样精度16bit,双声道,采集3分钟的一首歌曲大小为:

44100 * 16 * 2 * 3 * 60 = ‭254,016,000 bit

254,016,000 / 1024 / 1024 / 8 = 23MB


比特率:每秒传输的bit数量,采样频率 * 采样精度 * 通道数 = 44100 * 16 * 2 = 1411200bit/s

码率 : 一般指压缩过后的音频码率,常见的有

96kbps;
128kbps;
192kbps;
256kbps;

:每次编码的采样单元数,MP3通常是1152个采样点作为一个编码单元,AAC通常是1024个采样点作为一个编码单元。

帧长:
可以指每帧播放持续的时间:每帧持续时间(秒) = 每帧采样点数 / 采样频率(HZ)

比如:MP3 48k, 1152个采样点,每帧则为 24毫秒
	1152/48000= 0.024 秒 = 24毫秒


音频存储格式

交错模式:数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的左声道样本和右声道样本,再开始帧2的记录…

在这里插入图片描述

非交错模式:首先记录的是一个周期内所有帧的左声道样本,再记录所有右声道样本

在这里插入图片描述

开发中,如果格式选错,就会出现杂音。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

necesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值