FFmpeg 音视频基础

文章目录

视频基础

视频

视频 泛指将一系列静态影像以电信号的方式加以捕捉、记录、处理、储存、传送与重现的各种技术。

连续的图像变化每秒超过24帧画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面。看上去是平滑连续的视觉效果,这样连续的画面叫做视频。

图像

  1. 图像是泛指照片、动画等等形成视觉景象的事物。而图像就是由一个个像素点组成的。
  2. 像素 是一个图片的基本单位,pixpicture 的简写,加上元素element ,就得到了pixel ,简称px ,所以像素有图像元素之意。例如一个分辨率是1920X1080的图片,像素点就有1920X1080=2073600个
  3. 像素点在显示的时候需要用到颜色空间,常见的颜色空间有2种:RGBYUV

RGB颜色空间

在RGB模式下,每一种颜色都是红、绿、蓝三种颜色的混合,这种模式被称为叠加,这三种颜色被称为是主颜色(primary colors)。可以通过对颜色的叠加,来得到二级颜色(secondary colors),洋红色(红+蓝),青色(绿+蓝),黄色(红+绿)。在RGB颜色空间上,任何一个基色亮度为0时,就显示为黑色,当三种角色都达到最亮高度时,就表现为白色。

RGB适用于显示器等发光体的显示

YUV颜色空间

YUV是编译true-color颜色空间(color-space)的种类,YUV,YCbCR ,YPbPr等专有名词都可以称为YUV,彼此有重叠。Y表示明亮度(Luminance或Luma),也就是灰阶值,U和V表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

在最近十年中,视频工程师发现人眼对色度的敏感程度要低于对亮度的敏感程度。在生理学中,有一条规律,那就是人类视网膜上的视网膜杆细胞要多于视网膜锥细胞,说得通俗一些,视网膜杆细胞的作用就是识别亮度,而视网膜锥细胞的作用是识别色度。所以,你的眼睛对于亮和暗的分辨要比对颜色的分辨精细一些。基于此原理,保证Y分量的前提下,可以舍弃一部分UV分量,来减少对带宽的需求。却也并不会太影响图像的质量。
YUV颜色空间 是彩色电视兴起后,对黑白电视兼容的产物。因为RGB颜色空间中,每一个像素都需要三个分量的叠加,就是需要三通道的信号,即便是表示黑白像素。而在YUV颜色空间中,Y就是表示了灰度信息,也就是黑白图像。所以YUV像素编码,成功的兼容了黑白电视信号

YUV种类

YUV的格式有很多,常见的格式有YUV4:4:4,YUV4:2:2,YUV4:2:0

YUV4:4:4

YUV4:4:4采样,意味着Y、U、V三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是8bit,也就是一个字节

YUV4:2:2

YUV4:2:2采样,意味着UV分量采样的一半,Y分量和UV分量按照2:1的比例采样。如果水平方向有8个像素点,那么采样了8个Y分量,而只采样了4个UV分量

YUV4:2:0

YUV4:2:0采样,并不是指只采样U分量而不采样V分量,而是指,在每一行扫描时,只扫描一种色度分量(U或者V),和Y分量按照2:1的方式采样。比如,第一行扫描时,YU按照2:1的方式采样,那么第二行扫描时,YV分量按照2:1的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和Y分量相比都是2:1

YUV存储格式
  • 平面格式(planar):指先连续存储所有像素点的Y分量,然后存储U分量,最后是V分量
  • 打包模式(packed):指每个像素点的Y、U、V分量是连续交替存储的
RGB与YUV相互转换

Y = 0.299R + 0.587G + 0.114B

U = -0.147R - 0.289G + 0.436B

V = 0.615R - 0.515G - 0.100B


R = Y + 1.14V

G = Y - 0.39U - 0.58V

B = Y + 2.03U

分辨率

分辨率是指图像的大小或尺寸。比如1920X1080指图片的宽度为1920个像素,高度为1080个像素。

常见的分辨率有:360P(640X360)、720P(1280X720)、1080P(1920X1080)、4K(3840X2160)、8K(7680X4320)

其中1080和720是指垂直像素,分辨率除去垂直像素,还需要考虑到水平像素数。常见的宽高有16:9和4:3。

像素越多,视频就越清晰,所以1080p比720p的视频更加清晰。

有些网站的分辨率显示720i和1080i,这个i指什么,同样是1080,1080i和1080p哪个会更清晰?

其实i和p是指扫描方式,i表示隔行扫描,p则表示逐行扫描,以1080的视频举例:

  • 1080i: 1920X1080分辨率。隔行扫描模式下的高清图像是隔行显示的。每一个奇数行图像都在每一个偶数行图像后面显示出来。比如将60帧分成两部分,奇数帧只扫描1,3,5,7......行,偶数帧只扫描2,4,6,8......行,理论上人眼是察觉不出来画面不连续,反而是由于视觉残留,能自动将2帧叠加在一起。
  • 1080p:1920X1080分辨率。逐行扫描,每一线都同时表现在画面上,因此比隔行扫描电视更加的平滑。

位深

位深度是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深度来表示的。亦称作"位分辨率"(Bit resolution),计算机之所以能够显示颜色,是采用了一种称作"位"(bit)的计数单位来记录所表示颜色的数据。当这些数据按照一定的编排方式被记录在计算机中,就构成了一个数字图像的计算机文件,位是计算机存储器里的最小单元,它用来记录每一个像素颜色的值。图像的色彩越丰富,位就越多。每一个像素在计算机中所使用的这种位数就是"位深度"。

黑白二色的图像是数字图像中最简单的一种,它只有黑、白两种颜色,也就是说它的每一个像素只有1位颜色,位深度是1,用2的一次幂来表示,考虑带位深度平均分给R,G,B和Alpha,而只有RGB可以相互组合成颜色,所以4位颜色的图,它的位深度是4,只有2的4次幂种颜色,(即16种颜色或16种灰度等级)。8位颜色的图,位深度就是8,有2^8^ = 256种颜色。24位颜色可称之为真彩色,位深度是24,它能组合成2^24^ =16777216种颜色(或称千万种颜色),超过了人眼能够分辨的颜色数量。当我们用24位来记录颜色时,实际上是以2^8X3^,即红、绿、蓝三基色,各以2^8^=256种颜色存在,三色组合就形成千万种颜色。

例如:8位颜色图,位深度就是8,用2^8^表示,含有256种颜色(或256种灰度等级)。

更通俗的讲,8位颜色的图,每存储一个像素一般可以存放8位二进制。也就是8个01进行排列组合,排列组合的结果有2^8^种颜色,我们把每个像素可以表示颜色的2的幂指数称为深度。

帧率

所谓帧率,指的是相机在1秒钟内拍摄下多少幅连续的画面,它的单位是fps,即frame per second(每秒传输帧数)。比如25fps表示一秒有25张图片。人的视觉系统对画面有短暂的记忆能力,在同一形象不同动作连续出现的时候,只要形象的动作切换速度足够快,观者在看下张画面时,会重叠之前一张的印象,因此产生形象在运动的幻觉,一般图像帧率达到24帧,我们会认为图像是连续动态的。

帧率越高,画面越流畅,需要的设备性能也越高。如今刷的短视频帧率基本上都是30fps和60fps。

码流

码流(Data Rate)是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,通俗一点理解就是取样率,是视频编码中画面质量控制中重要的部分,一般我们用的单位是kb/s或者Mb/s,一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。视频文件在单位时间内使用的数据流量。比如1Mbps。

对于一个未编码的RGB码流, 码流大小 = 分辨率 × 3 × 帧率 码流大小=分辨率\times3\times帧率 码流大小=分辨率×3×帧率(单位:字节Byte)

例如:对于一个视频帧率是30fps,分辨率是1920X1080,码流大小就是 1920 × 1080 × 3 × 30 = 769824000 ≈ 734 M / s 1920\times1080\times3\times30=769824000\approx734M/s 1920×1080×3×30=769824000≈734M/s

对于一个未编码的YUV码流, 码流大小 = 分辨率 × 1.5 × 帧率 码流大小=分辨率\times1.5\times帧率 码流大小=分辨率×1.5×帧率(单位:字节)

步幅(stride)

我们都知道现在计算机的CPU都是32位或者64位的,他们一次最少读取4、8个字节,如果少于这些,反而要做一些额外的工作,会花更长的时间。所以会有一个概念叫做内存对齐,将结构体的长度设为4、8的倍数。Strude也是因为同样的理由出现的。因为图像的操作通常按行操作,如果图像的所有数据都紧密排列,那么会发生非常多次的读取非对齐内存,从而影响效率,而图像的处理本就是一个分秒必争的操作,所以为了性能的提高,就引入了stride这个概念。

stride就是指图像中的每行图像数据所占的存储空间的长度,它是一个大于等于图像宽度的内存对齐的长度。这样每次以行为基准读取数据的时候就能内存对齐,虽然可能会有一点内存浪费,但是在内存充裕的今天已经无所谓了。

当视频图像存储在内存时,图像的每一行末尾也许包含一些扩展内容,这些扩展内容只影响图像如何存储在内存中,但不影响图像如何显示出来。如果图像的每一行像素末尾拥有扩展内容,stride的值一定大于图像的宽度(byte)值。

音频基础

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

声音是一种波,可以被人耳识别的声(频率在20Hz~2000Hz之间),我们称之为声音。

想要把声音保存下来就需要对其进行数模转换,即将声音这样的模拟信号转变为数字信号。其过程如下所示:

  • 首先,声波通过空气传播到麦克风的振膜。
  • 然后,振膜随空气抖动的振幅大小产生相应的电学信号。我们把这种带有声学表征的电学信号叫做模拟信号(Analog signal)
  • 最后,通过A/DC(模数转换器)将模拟信号转换成数字信号(Digital signal)。即通过PCM(Pulse Code Modulation)脉冲编码调制对连续变化的模拟信号进行抽样、量化和编码转换成离散的数字信号。

这样我们就实现了音频信号的采集,我们常说的PCM文件就是未经封装的音频原始文件或者叫做音频"裸数据"。

音频在量化的过程中就涉及到了3个基本概念:采样位深、采样率和通道数。它们也决定着量化后的音频质量。

采样位深

采样位深也叫做采样大小,采样精度,采样格式。采样位深是指每个采样点用多少bit来表示。比如位深16就代表每个采样点需要16bit来进行存储。从物理意义上来说,位深代表的是振动幅度的表达精确程度或者说粒度。假设数字信号是一个1到-1的区间,如果位深为16bit,那么15个bit可以表征0~32767个数,那么振幅就可以精确到1/32767的粒度了。

我们一般在网络电话中用的就是16bit的位深,这样不太会影响听感,并且存储和传输的耗费也不是很大。而在做音乐或者更高保真度要求的场景中,则可以使用32bit甚至64bit的位深来减少失真。

8bit时失真就比较严重了。早期受到音频技术条件限制,很多音频都是8bit的,声音会显得比较模糊,如今也只有一些电话和对讲机等设备还有使用,但有趣的是,有的音乐就追求这种模糊感,所以8bit有的时候也代表一种听感朦胧的音乐艺术类型。

采样率

采样率也叫采样频率。采样率就是1秒内采集到采样点的个数,一般用赫兹来表示。比如1秒有48000个采样点,那么采样率就是48000Hz(48kHz)。

根据奈奎斯特采样定理,在进行模拟/数字信号的转换过程中,当采样率fs大于信号中最高频率fmax的2倍时,采样之后的数字信号才可以完整地保留原始信号中的信息,也就是说采样率和保留的声音频率基本上是2倍的关系。

通道数

通道数也叫声道数,声道数量,我们听歌的时候,戴上耳机如果听到的左右耳朵是不一样的,能够感觉到声音是从不同方向传过来的,那么就说明这个音频是双声道,我们通常也把这种双声道音频叫做立体声(stereo)。除此之外,还有3声道,2.1声道或者5.1声道等

除了播放需要多少声道以外,采集也可能采集到多通道的数据。比如麦克风阵列采集到的原始信号,有多少个麦克风就会有多少个通道的音频信号。因此这里通道数的物理含义其实就是同一时间采集或播放的音频信号的总数。

PCM音频大小计算

假设我们有一个立体声PCM音乐文件。它记录了1分40秒的采样率为48kHz的音频。如果这个文件的采样位深是16bit,那么这个立体声文件应该占用多大的存储空间呢?如果不经过压缩实时传输播放,又至少需要多少的带宽呢?

有了前面的知识,我们就可以知道,一个PCM音频文件的存储大小就是采样位深、采样率、通道数和持续时间的累乘。即: 存储空间 = 采样位深 × 采样率 × 通道数 × 时长 = 16 × 48000 × 2 × 100 = 18.31 M B 存储空间=采样位深\times采样率\times通道数\times时长=16\times48000\times2\times100=18.31MB 存储空间=采样位深×采样率×通道数×时长=16×48000×2×100=18.31MB

而它实际传输所需的带宽就是它每秒所需的比特带宽。这可以用采样位深、采样率和通道数来得到。即: 比特带宽 = 采样位深 × 采样率 × 通道数 = 1500 k b p s 比特带宽=采样位深\times采样率\times通道数=1500kbps 比特带宽=采样位深×采样率×通道数=1500kbps

比特率

比特率是指每秒传送的bit数。单位bps(bit per second),比特率越高,传送数据速度越快。
比特率 = 采样频率 × 采样位深 × 通道数 比特率=采样频率\times采样位深\times通道数 比特率=采样频率×采样位深×通道数

音频码率

音频的码率是指压缩后的音频数据的比特率,是音频数据在单位时间内的传输速率或者压缩率,表示每秒钟传输或存储的音频数据量,通常以kbps(千比特每秒)为单位: 码率 = 音频文件大小 ÷ 时长 码率=音频文件大小\div时长 码率=音频文件大小÷时长

常见的音频码率有:

  • 96 kbps:FM音质,适用于一些对音质要求不高的场景
  • 128-160 kbps:普通质量的音频码率,常用语在线音乐流媒体服务和普通音乐下载,该码率音质叫号,能够提供清晰的声音,在复杂的音频场景中可能会出现一些细节丢失
  • 192 kbps: CD音质,该码率提供更高的音质,适用于对音质要求较高的音乐和音频内容,它在保持相对较小的文件大小的同时,提供更多的音频细节和动态范围
  • 256-320 kbps:高质量音频的码率范围,通常被视为无损音质,该码率的音频文件能够提供非常接近原始录音的音质,适用于需要保留尽可能多音频细节的场景

音频帧

理论上,音频并不需要音频帧的概念,因为音频采样数据和采样率已经可以把音频播放描述清楚了,但是音频文件播放时,为了保证音视频同步,程序需要根据每帧的播放时间戳进行有序播放,但是每个音频采样数据太小了,如果每个采样数据都记录播放时间戳的话,那么就得不偿失了,毕竟一个时间戳数据的大小比一个音频采样数据都大,所以就有了音频帧的概念。

音频帧实际上就是把一小段时间的音频采样数据打包起来,如每20ms的音频采样数据合并成一帧。这里的具体时间间隔是具体编码格式决定的,一般不需要特别关心。比如MP3通常是1152个采样点作为一个编码单元,AAC通常是1024个采样点作用一个编码单元

一帧播放时长(单位:毫秒 m s ) = 采样点数 ÷ 采样率 一帧播放时长(单位:毫秒ms)= 采样点数\div采样率 一帧播放时长(单位:毫秒ms)=采样点数÷采样率

例如一帧AAC的音频帧,采样率是44100Hz
播放时长 = 1024 ÷ 44100 ≈ 0.0232 m s 播放时长= 1024\div44100\approx0.0232ms 播放时长=1024÷44100≈0.0232ms

音频帧的存储模式

和视频帧一样,音频帧在存储的时候也分为交错模式和非交错模式

  • 交错模式:数字音频信号存储的方式。数据以连续帧的方式存放,即先存储第一帧的左声道样本和右声道样本,再开始存储第二帧的样本数据,以此类推

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

音频编码原理

数字音频信号如果不加压缩地直接进行传送,将会占用极大的带宽。例如,一个双声道,采样率是44100Hz,位深是16bit的数字音频,其码率为1.411Mbit/s

如此大的带宽将给信号的传输和处理都带来许多困难和成本(阿里云服务器带宽大于5M后,每M的价格是100元/月)因此必须采取音频压缩技术对音频数据进行处理,才能有效地传输音频数据。

数字音频压缩编码在保证信号在听觉方面不产生失真的前提下,对音频数据信号进行尽可能大的压缩,降低数据量。数字音频压缩编码采取去除声音信号中冗余成分的方法来实现。所谓冗余成分指的是音频中不能被人耳感知到的信号,它们对确定声音的音色,音调等信息没有任何的帮助。

冗余信号包含人耳听觉范围外的音频信号以及被掩蔽掉的音频信号等。例如,人耳所能察觉的声音信号的频率范围为20Hz~20KHz,除此之外的其它频率,人耳无法察觉,都可以视为冗余信号。此外,根据人耳听觉的生理和心理声学现象,当一个强音信号与一个弱音信号同时存在时,弱音信号将被强音信号所掩蔽而听不见,这样弱音信号就可以视为冗余信号而不用传送,这就是人耳听觉的掩蔽效应,主要表现在频域掩蔽效应和时域掩蔽效应

频域掩蔽效应

一个频率的声音能量小于某个阈值之后,人耳就会听不到。当有另外能量较大的声音出现的时候,该声音频率附近的阈值会提高很多,即所谓的掩蔽效应。如图所示:

由图中我们可以看出人耳对2kHz~5kHz的声音最敏感,而对频率太低或者太高的声音信号都很迟钝,当有一个频率为0.2kHz、强度内60db的声音出现时,其附近的阈值提高了很多。

由图中我们还可以看出在0.1kHz以下,1kHz以上的部分,由于离0.2kHz强信号较远,不受0.2kHz强信号影响,阈值不受影响。而在0.1 ~ 1kHz范围,由于0.2kHz强音的出现,阈值有较大的提升,人耳在此范围所能感觉到的最小声音强度大幅提升。如果0.1 ~ 1kHz范围内的声音信号的强度在被提升的阈值曲线之下,由于它被0.2kHz强音信号所掩蔽,那么此时我们人耳只能听到0.2kHz的强音信号而根本听不见其他弱音信号,这些与0.2kHz强音信号同时存在的弱音信号就可视为冗余信号而不必传送。

时域掩蔽效应

当强音信号和弱音信号同时出现时,还存在时域掩蔽效应。即两者发生时间很接近的时候,也会发生掩蔽效应。时域掩蔽过程曲线入土所示,分为前掩蔽、同时掩蔽和后掩蔽三部分。

  • 前掩蔽 是指人耳在听到强信号之前的短暂时间内,已经存在的弱信号会被掩蔽而听不到
  • 同时掩蔽 是指当强信号和弱信号同时存在时,弱信号会被强信号所掩蔽而听不到
  • 后掩蔽 是指当强信号消失后,需要经过较长的一段时间才能重新听见弱信号,称为后掩蔽。

这些被掩蔽的弱信号即可视为冗余信号。

音频编码过程

对每一个音频声道中的音频采样信号

  1. 将他们映射到频域中,这种时域到频域的映射可以通过子带滤波器实现。每个声道中的音频采样块首先要根据心理声学模型来计算掩蔽门限值(人耳对1 ~7 kHz较为敏感)
  2. 由计算出的掩蔽门限值决定从公共比特池中分配给该声道不同频率域中多少比特数,接着进行量化以及编码工作
  3. 将控制参数及辅助数据加入数据之中,产生编码后的数据流

音视频处理流程

音视频录制

音视频播放

相关推荐
键盘会跳舞1 小时前
【Qt项目实战】使用脚本拓展CPP应用程序(2)——Lua脚本及编辑器
qt·编辑器·lua
z千鑫5 小时前
【人工智能】ChatGPT 4的潜力:AI文案、绘画、视频与GPTs平台详解
人工智能·chatgpt·音视频
千千道5 小时前
Qt 实现 UDP 广播的详细教程
开发语言·qt·网络协议·udp
BT-BOX6 小时前
基于STM32的火灾烟雾报警器Proteus仿真设计(仿真+程序+设计报告+讲解视频)
stm32·proteus·音视频
吃个糖糖6 小时前
Qt 联合Halcon视觉框架(2)
数据库·qt·系统架构
易我数据恢复大师9 小时前
怎样把音频中某个乐器分离?分离乐器音轨技术
音视频·人声分离·音频提取·乐器分离
少年少年少年奋斗奋斗奋斗9 小时前
使用 ffmpeg 给视频批量加图片水印
ffmpeg·音视频
电子科技圈9 小时前
边缘AI和智能音频专家XMOS全球首家增值经销商(VAR)落地中国
人工智能·科技·嵌入式硬件·mcu·物联网·音视频·iot
xingqing87y9 小时前
视频怎么转音频mp3?5种视频转音频的方法
音视频