音视频开发指南(1)-音视频基础概念

声音的物理性质

声音是波, 声音是由物体震动而产生的,震动使周围的空气发生疏密变化,形成疏密相间的纵波,由此产生声波

声波的三要素

  1. 频率
  • 代表音阶的高低, 频率越低,波长越长, 能量衰减越小,就能传的远

  • 人耳能听到的频率范围约是20Hz~20kHz

  1. 振幅
  • 代表响度,用分贝描述,反映声音的大小
  1. 波形代表音色
  • 钢琴和小提琴的声音完全不同,因为音色不同,说明介质所产生的波形不同

数字音频

为了将模拟信号数字化, 分为三个步骤, 采样、量化和编码

采样

  • 在时间轴上对信号进行数字化

  • 根据采样定理, 以声音最高频率2倍的频率对声音进行采样(AD转换), 声音质量不会减少

  • 所以采样频率一般为44.1kHz, 这样就能保证20kHz也能被数字化, 代表1秒回采样44100次

量化

使用量化表示每个采样, 它是指在振动轴上对信号进行数字化, 比如用 16 比特来表示一个采样, 表示范围为(-32768, 32767), 表示音频信号在振幅上分为65536层

编码

  • 按照一定格式记录采样和量化后的数字数据,, 比如顺序存储和压缩存储

  • 音频的裸数据格式就是PCM(Pluse Code Modulation, 脉冲编码调制), PCM 需要如下几个概念进行描述

  • 量化格式(sampleFormat)

  • 采样率(sampleRate)

  • 声道数(channel)

  • 数据比特率, 表示声音1秒内的比特数目,用来衡量音频数据单位时间内的容量大小

  • 比如CD音质,量化格式是16比特(2字节),采样率44100,声道数是2, 则比特率为 44100 * 16 * 2 = 1378.126kbs = 10MB

音频编码

如果CD按照10MB/s的速度进行存储,数据量就太大了,无法在网络传播了,所以必须进行压缩编码

压缩的原理就是压缩掉冗余信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号

压缩分为两种

  1. 无损压缩

  2. 有损压缩

下面介绍集中常用的压缩编码格式

WAV 编码

  • WAV是在PCM原始音频数据格式的前面加上44字节,用来描述PCM的采样率,声道数,数据格式

  • 和PCM一样,是无损的

MP3

有不错的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码率听感上非常接近WAV

文件

-128Kbit/S上表现不错,压缩比也比较高,兼容性强

AAC

AAC是新一代音频有损压缩技术, 在小于128Kbit/s的码率上表现优异,多用于视频中的音频编码

Ogg

  • 各种码率下都表现优秀 ,尤其在中低码率下

  • 除了音质好外,还是完全免费的

  • 兼容性不够好,不支持流媒体特性

图像的物理现象

图像是由RGB三原色组成的,分辨代表red(红色) Green(绿色) blue(蓝色))

如果屏幕的分辨率1280x720, 表示水平方向上有1280个像素,垂直方向有720个像素,每个像素点都由RGB三个子像素点表示,可以通过显微镜看到每个像素点

图像尺寸

针对1280x720的RGBA(增加一个透明度A, 总共占有8个字节)

1280x720 x4 = 3.516MB,这就是位图在内存占用的大小,每张图片裸数据都是很大的,需要压缩才能在网络上传输

JPEG 是最常见的图片压缩算法

图片的YUV表示方法

针对视频帧裸数据,其实更多的是YUV数据格式

YUV主要应用于优化彩色视频信号传输,向后兼容老式黑白电视

Y

Y表示明亮度(Luma), 也称为灰阶值,

亮度通过RGB输入信号来建立的, 方法是讲RGB信号的特定部分叠加到一起

U V

U和V表示色度(Chroma), 作用是描述影像的色彩和饱和度,用于指定像素的颜色

色度定义了颜色两个方面-色调和饱和度, 分别用 Cr和Cb来表示

Cr表示RGB输入信号中红色部分与RGB信号明亮度之间的差异

Cb反映RGB输入信号中蓝色部分与RGB明亮度之间的差异

为什么采用YUV色彩空间

因为亮度Y和色度信号U,V是分离的

如果只有Y信号没有色度信号U,V则表示黑白灰度图像

YUV数据大小

相较于RGB, 1280x720的视频帧,用YUV420P格式表示, 数据量大小是

1280 x 720 x 1 + 1280 x720 x 0.5 = 1.318MB

如果fps(1秒的数据帧数目)是24, 按照90分钟的电影长度计算,这部电影使用YUV420P格式表示大小为

1.318MB x 24fps x 90 x 60s = 166.8GB

这么大的容量无法再网络上进行流媒体播放了,所以要进行视频编码和压缩

视频编码和压缩

和音频编码类似,视频编码也是通过去除冗余信息来进行压缩的.

相较于音频数据,视频数据有极强的相关性, 包括空间冗余信息和时间冗余信息

使用帧内编码技术去除空间上的冗余信息

针对时间冗余信息,使用帧间编码技术去除,包含如下几个方面

1. 运动补偿: 通过先前的局部图像来预测,补偿当前的局部图像,减少帧序列冗余信息的有效方法

  1. 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息

  2. 运动估计:从视频序列中抽取运动信息

MPEG

  • 图像编码标准是JEPG, 对于视频,ISO也制定同样的标准, Motion JPEG即MPEG, 适用于动态视频的压缩算法

  • 除了对单帧图片进行编码外,还利用图像序列中的相关原则去除冗余, 可以大大提高压缩比

  • 有这样几个版本,Mpeg1(用于VCD), Mpeg2(用于DVD), Mpeg4 AVC(流媒体)

H26X 系列

  • ITU_T 制定了H.261, H.262,H.263,H.264等视频编码格式

  • H.264集中了以往所有的标准的有点,并吸取了以前标准的经验

  • H.264创造了多参考帧,多块类型,整数变换,帧内预测等新的压缩技术

IPB帧

视频压缩中,每帧代表一副静止的图片,IPB帧是最常见的一种压缩算法

I帧

  • 帧内编码帧, 表示每个GOP的第一个帧,作为随即访问的参考点,可以当做静态图片

  • I帧可以看做一个图像经过压缩后的产物,可去掉空间冗余信息

P帧

  • 前向预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图片,也称为预测帧

  • 参考前面的一个I帧和P帧来解码一张完整的图片

B帧

  • 双向预测内插编码帧, 即考虑源图像序列前面的已编码帧,也估计后面的帧之间的时间溶于信息,也称为双向预测帧

  • 参考前一个I帧和P帧以及后面的一个P帧来生成一张完整的视频画面

css 复制代码
所以P帧和B帧去除时间维度上的冗余信息

PTS和DTS

  • DTS用于视频的解码, 英文为Decoding Time Stamp, PTS 用于解码阶段进行视频的同步和输出, 成为 Presentation Time Stamp

  • 在没有B帧的情况下,DTS和PTS的输出顺序是一样的, 有B帧,就不一样了

GOP

  • 两个I帧之间形成的一组图片,就是GOP(Group Of Picture), 通常在编码器设置参数的时候, 必须设置gop_size的值,代表两个I帧之间的帧数目

  • gop_size设置的越大,I帧之间的B帧数目就越大, 节省出来的空间可以传输更大尺寸的I帧, 最后传输的画面的质量越好

相关推荐
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
捕鲸叉7 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
岁月小龙7 小时前
如何让ffmpeg运行时从当前目录加载库,而不是从/lib64
ffmpeg·origin·ffprobe·rpath
Dola_Pan8 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
yanlou2338 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法
小林熬夜学编程8 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法