目录

音视频开发-音视频基础

音视频开发–音视频基础

音视频基础

一、音视频录制原理

https://i-blog.csdnimg.cn/blog_migrate/208400c7fd2e790f8891f2d201fd0992.png

视频录制流程

1、准备摄像头

2、图像帧阶段

从摄像头采集视频数据(图像帧),采集数据格式:YUV或者RGB,YUV和RGB细分的话还包括YUV 4:4:4、YUV 4:2:2、YUV 4:2:0等,RGB细分的话还包括RGB565、RGB555、RGB24、RGB32、ARGB32等格式.

3、图像处理阶段

我们采集完数据之后,就可以对采集到的数据进行处理了。例如:曝光、色度、温和度、色差等等。都可以在这个阶段做。

4、图像帧队列阶段

处理后的图像帧,会暂存放到图像帧队列中,等待视频编码器来对数据进行编码;

5、视频编码阶段

如果图像帧队列中有数据的话,视频编码器就会进行处理。如果不做编码的话,视频的体积是非常大的,而此阶段的技术也是非常多的,还可以称之为压缩。

6、视频包队列阶段

将压缩完的数据,暂存到视频包队列;

7、复用器

复用器进行音视频封装(例如:封装成mp4等)

8、写入到文件。

音频录制流程

1、准备麦克风

2、采样帧阶段

从麦克风采集的音频数据,采集的音频数据又称为PCM,采样帧的概念:采多少数据作为一帧去做编码压缩

3、音频处理阶段

为什么要做音频处理,有时候你要对你这个声音,如果你要想做一些变音,比如你这个声音比较尖锐,那你想把它把它压的稍微低沉一点,那这个时候就是可以做这个音频处理。

4、采样帧队列阶段

处理后的采样帧,会暂存放到采样帧队列中,等待采样编码器来对数据进行编码;

5、音频编码阶段

音频编码器从采样帧队列读取处理好的采样帧进行压缩。

6、音频包队列

将压缩完的数据,暂存到音频包队列;

复用器(音视频封装)

将音频包队列中的数据和视频包的数据进行封装,按照一定的规则写到文件中。

时钟

为了音视频同步,在采集采样帧和图像帧同时加上一个时间戳。

二、音视频播放原理

https://i-blog.csdnimg.cn/blog_migrate/c28504ee216522ed7e2d43f52a937319.png 音视频播放原理 :实际上是音视频录制的 逆向过程 。,如果你是按照MP4的格式写到文件里面去,那你现在在播放的时候,那你就按照MP4的规则把这个音频跟视频分离出来,那我们再往下面去看,你可以看到也是同样存在这种队列,存在这种队列有什么用呢,这实际上他这队列就是先把数据放到队列里面去,然后等待,我们解码线程去从队列里面去获取数据的音频跟视频都是一样的,然后我们解码后,那我们也会去继续放到帧队列里面去呢,帧队列为什么还放在帧队列里面,因为我们后面还要做一个音视频同步控制,所以我们要先把数据稍微缓存一下,缓存一下,然后再去通过音视频同步的时候,我们才真正的把它拨到这个喇叭或者这个显示器里面来,但是还有一点要注意的是,比如我这边音频,你是可以做音频处理,就可以做一些音效处理,比如你可以调这个重低音呢,那就可以做这个音频的,做音频的一个算法处理,那比如你要把这个图像这个亮度,把这种色彩给调一下,那你就可以用这个图像处理这样子的一个模块,还有一个点就是这个音视频同步这一块,有的时候是在音频处理和图像处理后进行时间同步。

https://i-blog.csdnimg.cn/blog_migrate/e8e1d83a65ff902e40d0a547a2d3a3bc.png

三、图像基础概念

像素 :像素是一个图片的基本单位,例如2500×2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共是500万个像素,也俗称500万像素照片。

分辨率 :是指图像的大小或尺寸。

常见的分辨率:

360P(640x360)、720P(1280x720)、1080P(1920x1080)、4K(3840x2160)、8K(7680x4320)

位深 :我们看到的彩色图片,都有三个通道,分别为红(R)、绿(G)、蓝(B)通道。(如果需要透明度则还有alpha分量)通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256 256 256=16,777,216 = 1677万种颜色。这里的8bit就是我们讲的位深。 每个通道的位深越大,能够表示的颜色值就越大 ,比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。1024 1024 1024约为10,7374万色=10亿色, 是8bit的64倍。 常见的颜色还是8bit居多

帧率 :在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。比如25fps表示一秒有25张图片。

常用帧率:

电影帧率一般是 24fps(帧每秒);

电视剧一般是25fps;

监控行业常用 25fps;

音视频通话常用15fps;

帧率越高,画面越流畅,需要的设备性能也越高。

码率 :视频文件在单位时间内使用的数据流量。比如1Mbps。对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,视频画面就会越清晰。但是在外在因素(例如光线不足)作用下,分辨率小的视频有可能比分辨率大的视频清晰。

Stride跨距:

https://i-blog.csdnimg.cn/blog_migrate/08de4953c5b23ba9c3cc8a833dfdadae.png

YUV

YUV:“Y”表示明亮度,也就是灰阶值,“U”和“V”表示的则是色度。

YUV排列方式

YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种具体的格式:

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

平面(planar)格式 :使用 三个数组 分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中。

https://i-blog.csdnimg.cn/blog_migrate/7fc3442f18a096db8bd688b1e9af9195.png YUV采样表示法

YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中 黑点表示采样像素点Y分量空心圆表示采样像素点的UV分量 。主要分为 YUV 4:4:4、YUV 4:2:2、YUV 4:2:0 这几种常用的类型。

YUV4:4:4采样法 :4:4:4 表示色度频道没有下采样,即 一个Y分量对应着一个U分量和一个V分量

https://i-blog.csdnimg.cn/blog_migrate/43e358c4f01671b095d4b808d51f4c04.png

YUV4:2:2采样法 :4:2:2 表示 2:1 的水平下采样,没有垂直下采样,即 每两个Y分量共用一个U分量和一个V分量

https://i-blog.csdnimg.cn/blog_migrate/e77c7ade1a69898a803081487d8261d6.png

YUV4:2:0采样法 :4:2:0 表示 2:1 的水平下采样,2:1 的垂直下采样,即 每四个Y分量共用一个U分量和一个V分量

https://i-blog.csdnimg.cn/blog_migrate/96fa4ada75939860f5678df010ab9e89.png

YUV数据存储

I444(YUV444P)格式 , 对应Ffmpeg像素表示AV_PIX_FMT_YUV444P///< planar YUV

4:4:4, 24bpp , (1 Cr & Cb sample per 1x1 Y samples),该类型为planar(平面)格式

https://i-blog.csdnimg.cn/blog_migrate/e76312760b3f54af82ce47d53d628fb9.png

I422(YUV422P)格式 :对应Ffmpeg像素表示AV_PIX_FMT_YUV422P///< planar YUV 4:2:2, 16bpp , (1 Cr

& Cb sample per 2x1 Y samples),该类型为planar(平面)格式。

https://i-blog.csdnimg.cn/blog_migrate/ac4f4836c3ab3ed7b3734c46d94cdc81.png

I420(YUV420P)格式 :对应Ffmpeg像素表示AV_PIX_FMT_YUV420P///< planar YUV 4:2:0, 12bpp(1.5字节:(4个Y + 一个U + 一个V) / 4 = 1.5字节 ) , (1 Cr& Cb sample per 2x2 Y samples),该类型为planar(平面)格式。

https://i-blog.csdnimg.cn/blog_migrate/46122206165559923e75bcaf1f7f4804.png

NV12格式 :对应Ffmpeg像素表示AV_PIX_FMT_NV12, ///< planar YUV 4:2:0, 12bpp, 1 plane

for Y and 1 plane for the UV components, which are interleaved (first byte U and

the following byte V)

https://i-blog.csdnimg.cn/blog_migrate/2df6b15dcc84081792d61719d098c404.png

RGB和YUV的转换

https://i-blog.csdnimg.cn/blog_migrate/7d5eda917d0329834fd4223523b07f1b.png

YUV Stride对齐问题

https://i-blog.csdnimg.cn/blog_migrate/0c4a0eb93a8aa0d5d422d2f0c0ec8edf.png

四、视频主要概念l

I帧 :帧内编码帧(intra picture),又称全帧压缩编码帧。I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,作为随机访问的参考点,可以当成静态图像。 I帧不需要参考其他画面而生成,解码时仅靠自己就重构完整图像

  • I帧图像采用帧内编码方式;
  • I帧所占数据的信息量比较大;
  • I帧图像是周期性出现在图像序列中的,出现频率可由编码器选择;
  • I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
  • I帧是帧组GOP的基础帧(第一帧),在一组中只有一个帧;
  • I帧不需要考虑运动矢量;

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

B帧 :双向预测内插编码帧(bi-directional interpolated prediction frame),既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称为双向预测帧。

基于以上对IPB帧的定义,以下从解码的角度来理解IPB帧:

I帧 :自身可以通过视频解压算法解压成一张单独的完整视频画面,所以I帧去掉的是视频帧在空间维度上的冗余信息。

P帧 :需要参考前面的I帧或者P帧来解码成一张完整的视频画面。

B帧 :需要参考前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗余信息。

https://i-blog.csdnimg.cn/blog_migrate/62c7a81cf93adc452c575134827966c0.png

五、封装格式+音视频同步

封装格式(也叫容器) :就是将已经编码压缩好的视频流、音频流及字幕流按照一定的格式放到一个文件中,便于播放软件播放。视频文件的后缀就是它的封装格式。

常见的封装格式:

https://i-blog.csdnimg.cn/blog_migrate/ecb4c7479dff781089a67031b644e835.png 音视频同步概念:

DTS :即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。

PTS :既显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧数据。

音视频同步方式:

Audio Maste r:同步视频到音频

Video Master :同步音频到视频

External Clock Master :同步音频和视频到外部时钟

一般情况同步优先级为: Audio Maste

External Clock Master

Video Master