当前位置: 首页 > ops >正文

【音视频开发】音视频基础概念

目录

🌈前言🌈        

📁 音频

📁 音频编码

📁 图像

📁 视频编码

📂 IPB帧

📂 PTS与DTS

📂 GOP的概念

📁 总结音视频开发相关知识点


🌈前言🌈        

        这个系列在我学习过程中,对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少,所以我希望通过这个音视频系列,跟大家一起学习音视频,希望减少初学者在学习上的压力,同时希望也欢迎指出文章的不足。

📁 音频

        我们先来了解一下什么是声音。声音是由物体振动而产生的。

        声音是一种压力波,即声波。当演奏乐器、拍打一扇门或者敲击桌面时,它们的振动都会引起空气有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波(可以理解为石头落入水中激起的波纹),由此就产生了声波,这种现象会一直延续到振动消失为止。

        声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。

        人类耳朵的听力有一个频率范围,大约是20Hz~20kHz。人耳对3~4kHz频率范围内的声音比较敏感。

        计算机一堆机器,只能通过01来存储信息,因此我们需要将现实中的模拟信号转化为计算机能识别的数字信号。

        模拟信号转为数字信号分为3步骤:采样 -> 量化 -> 编码

1. 采样:

        指在时间轴上对模拟信号进行数字化。根据奈奎斯特定理(也称为采样定理),按比
声音最高频率高2倍以上的频率对声音进行采样(也称为AD转换)对于高质量的音频信号,其频率范围(人耳能够听到的频率范围)是20Hz~20kHz,所以采样频率一般为44.1kHz,这样就可以保证采样声音达到20kHz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。而所谓的44.1kHz就是代表1秒会采样44100次。

2. 量化

        指在幅度轴上对信号进行数字化。例如使用16bit的二进制信号来表示一个采样,信号在幅度上分为65536层,范围是[-32768,32767]。

3. 编码

        这么多的采样都要量化,如何进行存储?因此需要编码。即按照一定格式记录采样和量化或的数据。音频裸数据格式是 脉冲编码调制 PCM 数据。描述PCM数据一般需要3个概念:采样率(sampleRate),量化格式(sampleFormat),声道(channel)。

        对于声音格式,还有一个概念藐视它的大小,称为数据比特率,即 1s 内的比特数目,用于衡量音频数据单位时间内的容量大小。

量化格式(有的地方描述为位深度)为16比特(2字节),采样率为44100,声道数为2,即CD音质:

        44100 * 16 * 2 = 1,411.2kbps

1分钟内,这种内这种音质的数据需要占据多大空间:

        1,411.2kbps * 60 / 8 / 1024 约= 10MB

如果sampleFormat更加精确(比如用4字节来描述一个采样),或者sampleRate更加密集(比如48kHz的采样率),那么所占的存储空间就会更大,同时能够描述的声音细节就会越精确。

        以上就将模拟信号转换为计算机能识别的数字信号了,之后可以对这段二进制数据进行存储、播放等操作了。

📁 音频编码

        在上计算中,我们得出量化格式(有的地方描述为位深度)为16比特(2字节),采样率为44100,声道数为2这么一段普通的1分钟音频PCM数据需要 10MB左右。如果是存储设备中可以接受,但如果是在网络中传输,那可就太大了,因此需要对数据进行压缩编码。

        压缩编码的基本指标之一就是压缩比,压缩比通常小于1(否则就没有必要去做压缩,因为压
缩就是要减小数据容量)。

        压缩算法分为 无损压缩 和 有损压缩,无损压缩是指解压后的数据可以完全复原,有损压缩相反,解压后的数据不能完全复原,会丢失一部分信息,压缩比越小,丢失的信息越多,信号还原后的失真越大。

        压缩算法的原理就是压缩掉冗余信号,即超出听觉范围的以及被掩蔽掉的信号。例如说话声音大的人会掩盖掉声音小的人所说的话得。

下面介绍几种常用的压缩编码格式:

1. WAV编码

        WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。

特点:音质非常好,大量软件都支持。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。

2. MP3编码

        使用LAME编码(MP3编码格式的一种实现)的中高码率的MP3文件,听感上非常接近源WAV文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。

特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。

3. AAC编码

AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE-AAC v2三种主要的编码格式。

特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。
适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码

4. Ogg编码

Ogg是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,尤其是在中低码率场景下。Ogg除了音质好之外,还是完全免费的,这为Ogg获得更多的支持打好了基础。

特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。
适用场合:语音聊天的音频消息场景。
 

📁 图像

        自然世界中,于光的反射,我们才能看到各类物体的轮廓及颜色。白光能够分解成多种色彩的光。后来人们通过实验证明,红绿蓝三种色光无法被分解,故称为三原色光,等量的三原色光相加会变为白光,即白光中含有等量的红光(R)、绿光(G)、蓝光(B)。

        我们来看看计算机中是如何存储图像的。

        计算机的屏幕显示就是由这一个个像素点组成,每个像素点都是由3个子像素点组成(RGB通道)。

        显示器分辨率是1280×720,说明水平方向有1280个像素点,垂直方向有720个像素点,所以整个手机屏幕就有1280×720个像素点(这也是分辨率的含义)。

        音频是通过16位比特来表示,像素中的3个子像素又如何表示呢?

        1. 浮点表示:取值范围为0.0~1.0,比如,在OpenGL ES中对每一个子像素点的表示使用的就是这种表达方式。

        2. 整数表示:取值范围为0~255或者00~FF,8个比特表示一个子像素,32个比特表示一个像素,这就是类似于某些平台上表示图像格式的RGBA_8888数据格式。

对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张1280×720的RGBA_8888图像的大小,可采用如下方式:

        1280 * 720 * 4 = 3.516MB

        这也是位图(bitmap)在内存中所占用的大小,所以每一张图像的裸数据都是很大的。对于图像的裸数据来讲,直接在网络上进行传输也是不太可能的,所以就有了图像的压缩格式,比如JPEG压缩。

        除了RGB表示表示方式,还有YUV表示方式。其中“Y”表示明亮度(Luminance或Luma),也称灰阶值;而“U”和“V”表示的则是色度(Chrominance或Chroma),它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。

        YUV主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需要占用极少的频宽(RGB要求三个独立的视频信号同时传输)

        我们人眼对于灰度的敏感度要高于色彩,例如我们只通过灰度图像就能看出图片的全部信息,而一个全是色彩的图像很难看出原来的信息。

        之所以采用YUV色彩空间,是因为它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。

        YUV可以划分为YUV444、YUV422、YUV420格式。其中YUV420格式是最常用的采样格式。

        

📁 视频编码

        与前面提到的音频编码类似,视频压缩也是通过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息时间上的冗余信息

📂 IPB帧

        视频是由一个个帧组成,一个帧就是一个静止的图像。在进行实际压缩时,会采取各种算法以减少数据的容量,其中IPB帧就是最常见的一种。

        · I帧:帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,作为随机访问的参考点,可以当成静态图像。I帧可以看作一个图像经过压缩后的产物,I帧压缩可以得到6:1的压缩比而不会产生任何可觉察的模糊现象。

        I帧压缩可去掉视频的空间冗余信息,下面即将介绍的P帧和B帧是为了去掉时间冗余信息。
        · P帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。
        · B帧:双向预测内插编码帧(bi-directional interpolated predictionframe),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称为双向预测帧

        总结一下,从解码角度理解IPB帧。

        · I帧自身可以通过视频解压算法解压成一张单独的完整视频画面,所以I帧去掉的是视频帧在空间维度上的冗余信息。
        · P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面。
        · B帧则需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗余信息。

        此外,H264综合岗还一种帧称为IDR帧,与I帧的区别什么?因为H264采用了多帧预测,所以I帧之后的P帧有可能会参考I帧之前的帧。这就使得在随机访问的时候不能以找到I帧作为参考条件,因为即使找到I帧,I帧之后的帧还是有可能解析不出来,而IDR帧就是一种特殊的I帧,即这一帧之后的所有参考帧只会参考到这个IDR帧,而不会再参考前面的帧。

        在解码器中,一旦收到一个IDR帧,就会立即清理参考帧缓冲区,并将IDR帧作为被参考的帧。

📂 PTS与DTS

        PTS可以简单理解为帧的显示时间;DTS是帧的解码时间。

        DTS主要用于视频的解码,英文全称是Decoding Time Stamp,PTS主要用于在解码阶段进行视频的同步和输出,全称是Presentation Time Stamp。

        因为B帧打乱了帧的解码和显示的顺序,因此有了DTS和PTS。

        FFmpeg中使用AVPacket结构体来描述解码前或编码后的压缩数据,用AVFrame结构体来描述解码后或编码前的原始数据。

        AVFrame就是视频的一帧图像,这帧图像什么时候显示给用户,取决于它的PTS。

        DTS是AVPacket里的一个成员,表示该压缩包应该在什么时候被解码。

📂 GOP的概念

        两个I帧之间形成的一组图片,就是GOP(Group Of Picture)的概念。

        通常在为编码器设置参数的时候,必须要设置gop_size的值,其代表的是两个I帧之间的帧数目。

        一个GOP中容量最大的帧就是I帧,所以相对来讲,gop_size设置得越大,整个画面的质量就会越好,但是在解码端必须从接收到的第一个I帧开始才可以正确解码出原始图像,否则会无法正确解码(这也是前面提到的I帧可以作为随机访问的帧)。

📁 总结音视频开发相关知识点

        音视频相关的名词,术语,概念。

1. 帧率

        用于测量帧数的量度。测量单位为每秒显示的帧数fps。

2. 分辨率

        形成的图像的大小或尺寸。

3. 刷新率

        屏幕每秒画面被刷新的次数,单位为Hz。

4. 编码格式        

        编码的目的是为了压缩数据量,采用编码算法压缩冗余数据。常见的编码格式:

5. 封装格式

        编码后的音视频数据以一定格式封装到一个容器中,封装格式有MKV,AVI,TS等。

6. 码率

        也称为比特率,指单位时间内播放连续的媒体(压缩后的音视频数据)的比特量。

        文件大小b = 时长s x 码率b/s

7. YUV 和 RGB

8. DTS 和 PTS

9. 量化精度

        可以将模拟信号分为几个等级,量化精度越高,声音越接近原生,单位是 bit。也可以理解为一个采样点可以用多少bit表示。

10. 采样率

        指每秒音频采样点的个数,单位是Hz。

11. 声道

        声音在录制或播放的时在不同空间位置擦刺激或回放的相互独立的音频信号,所以声道数也就是声音录制的音源数量或回放时相应的扬声器数量。

http://www.xdnf.cn/news/8793.html

相关文章:

  • 技术第一篇:odoo18 的登录认证机制
  • a+b+c+d==0(用哈希表进行优化)
  • 进行性核上性麻痹患者饮食指南:防呛咳、补营养的科学吃法
  • Java NPE为什么不会导致进程崩溃(CoreDump)
  • 同为科技 智能PDU产品选型介绍 EN10/G801FLR
  • 多角色多端状态控制与锁控制
  • Java Web
  • 一周学会Pandas2之Python数据处理与分析-Pandas2数据合并与对比-df.combine_first():填充合并
  • 李白、杜甫和白居易三者之间是否存在交集?
  • 6.4.2_1最短路径问题_BFS算法
  • 简单了解下Nacos
  • 【C语言指南】二维数组:概念、初始化与遍历
  • 5GC网络中的QoS Flow级QoS控制
  • Arduino Uno 热敏传感器实验
  • 防火墙高可用(HA)主备验证实验(eNSP)
  • 构造题(Constructive Problem)
  • ROS云课三分钟-阿克曼车式移动机器人倒车入库出库测试实验
  • python | vscode | 使用uv快速创建虚拟环境(实现一个项目一个虚拟环境,方便环境管理)
  • ADS学习笔记(三) 瞬态仿真
  • 【每天一个知识点】计算思维
  • java基础(面向对象高级部分)
  • [学习]浅谈C++异常处理(代码示例)
  • 2025.5.22 Axure 基础与线框图制作学习笔记
  • Linux中的文件系统和软硬连接
  • OpenGL环境配置
  • GAMES104 Piccolo引擎搭建配置
  • 【IPMV】图像处理与机器视觉:Lec12 Blob Detector 斑点检测
  • 进程通信-内存共享
  • 使用Java制作贪吃蛇小游戏
  • 历年福州大学保研上机真题