欢迎诸位来阅读在下的博文~
在这里,在下会不定期发表一些浅薄的知识和经验,望诸位能与在下多多交流,共同努力
文章目录
前期博客
一、视频录制和播放原理
这里的文件可以是mp4文件,也可以是其它格式的文件。我们可以想象每一个媒体文件就像一个盒子,里面放置了各种数据,如音频数据、视频数据、文件属性等等。就这些数据都放在一起是为了节省空间,还有方便传输。想象一下,如果诸位要发送一个多媒体视频给朋友,一个文件就是一个完整体,直接发送即可;可是如果不将各种数据集成到一起,你要从各种角落去寻找相应的数据去发送,是不是很麻烦,比如这个文件对应音频数据,这个文件对应视频数据,···,这下头都大了。
二、数字图像的存储方式
RGB方式
对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张分辨率为1280*270的
RGB_888图像的大小,可采用如下方式:1280 * 270 * 3B = 2.637MB;
假如是一部90分钟的电影,每秒25帧,则一部电影为
2.637MB * 90分钟 * 60秒 * 25FPS= 347.651GB
YUV格式
用途:主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视。
其中"Y"表示明亮度(Luminance或Luma),也称灰阶值;
"U"和"V"表示的则是色度(Chrominance或Chroma)作用是描述影像色彩及饱和度,用于指定像素的颜色。
为什么YUV格式可以用来压缩视频呢?
科学家分析出,人的眼球对于灰度的敏感性,要比色度大得多。比如诸位看图上的黑白照片,可以一下子就知道这是一个眼睛,但是看第三张的色度图片时,真不好区别。所以人们就想到,能不能在完好保存Y(灰度)的情况下,在UV上进行一些"偷工减料",以达到压缩视频的目的呢?答案是肯定的。
YUV格式有两大类:planar和packed。
◼ 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存
储所有像素点的U,随后是所有像素点的V。
◼ 对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。
◼ Libyuv,Google开源的实现各种YUV与RGB之间相互转换、
旋转、缩放的库。
YUV存在多种格式,比如YUV420p,YUV420sp等,不同的YUV格式的数据在存储时的排列顺序是不一样的,在开发的过程中必须非常注意,否则画面会显示不正常。比如花屏,绿屏等现象。
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
由上往下,压缩的效率会越来越大。
同样是一部90分钟的1280270电影,每秒25帧,则一部电影,相较于RGB,用YUV420P的格式
来表示,其数据量的大小如下:347.651GB * (4+2)/(43)= 173.76GB,即压缩成原来的一半。
值得注意的是,无论采用哪种格式方式,最终输出到屏幕时都要转换为RGB格式,以H264直播为例,如下:
三、描述视频属性的基本概念
- 视频码率:kb/s,是指视频文件在单位时间内使用的数据流量,也叫码流率。码率越大,说明单位时间内取样率越大,数据流精度就越高。
- 视频帧率:fps,通常说一个视频的25帧,指的就是这个视频帧率,即1秒中会显示25帧。帧率越高,给人的视觉就越流畅。
- 视频分辨率:分辨率就是我们常说的640x480分辨率、1920x1080分辨率,分辨率影响视频图像的大小。
当视频码率不足时,通常会发生以下情况:
- 视频质量下降:为了适应较低的码率,编码器会减少每帧的数据量,这可能导致视频质量下降,出现模糊、块效应或噪声。
- 帧率可能不变:帧率是指视频每秒播放的帧数,它与码率不同。如果视频文件或流媒体服务的帧率是固定的,比如30fps或60fps,那么降低码率通常不会直接影响帧率。但是,如果码率降低到一定程度,以至于无法在保持当前帧率的同时保持视频质量,编码器可能会选择丢弃一些帧(帧丢弃),从而降低实际的帧率。
- 帧丢弃:在一些情况下,如果码率非常低,编码器可能会选择丢弃一些帧以减少数据量。这会导致实际播放的帧率低于原始视频的帧率,从而影响视频的流畅度。
- 缓冲和延迟 :在流媒体传输中,如果码率降低,可能会导致播放器缓冲更多的数据以确保流畅播放,这可能会增加播放延迟。
总的来说,视频码率不足主要会影响视频质量,而视频帧率通常由视频源决定。但是,在极端情况下,为了适应低码率,编码器可能会降低帧率,从而影响视频的流畅度。
四、IPB帧
I帧、P帧和B帧是视频压缩技术中的三种不同类型的帧,它们在视频编码和传输中起着关键作用。
- I帧(Intra-coded frame) :
- 也称为关键帧(Keyframe)。
- I帧包含了完整的图像信息,不依赖于其他帧即可独立解码。
- I帧通常用于随机访问视频,因为它们可以单独解码显示完整的图像。
- 由于包含完整图像信息,I帧的压缩率相对较低,但解码速度快。
- 在视频序列中,I帧通常作为参考帧,用于预测后续的P帧和B帧。
- P帧(Predicted frame) :
- 也称为预测帧。
- P帧依赖于前面的I帧或P帧进行解码,它只存储与参考帧之间的差异信息。
- P帧通过预测和差分编码,可以更高效地压缩视频数据,减少冗余信息。
- P帧的压缩率通常高于I帧,但解码时需要参考前面的帧。
- B帧(Bidirectional frame) :
- 也称为双向预测帧。
- B帧依赖于前后两个方向的帧(通常是前一个P帧或I帧,以及后一个P帧或I帧)进行解码。
- B帧通过双向预测来提高压缩效率,它可以参考前后帧中的图像信息,只存储与前后帧之间的差异。
- B帧的压缩率通常高于P帧,但解码时需要更多的计算资源,并且需要前后帧的完整信息。
在视频编码中,I帧、P帧和B帧的使用顺序和比例对视频的压缩效率和播放质量有重要影响。通常,视频序列以I帧开始,然后是P帧和B帧,这样的组合称为一个图像组(Group of Pictures,GOP)。通过合理配置I帧、P帧和B帧的数量和位置,可以在保证视频质量的同时,实现高效的视频压缩。
五、音频的主要概念
采样
现实中我们听到的声音是连续波的,但是在计算机中只能通过采样来复原波形。
假设常用的采样频率44100,采样深度16bit,2通道(声道),采集4分钟的数据
44100 * 16 * 2 * 4 * 60= 338688000bit
338688000/8/1024/1024 = 40M字节
没有经过压缩的音频数据我们叫PCM数据
-
采样频率:44100 Hz 指的是每秒钟采集 44100 个样本点,这是音频信号的采样率,通常用于 CD 质量的音频。
-
采样深度:16 bit 指的是每个样本点的量化位数,表示每个样本的动态范围和精度。
-
2通道:指的是音频是立体声的,包含两个独立的声道,通常分别代表左声道和右声道。这意味着音频信号可以分别控制左右两个声道的音量和内容,以产生立体声效果。
比特率和码率
- 比特率 :每秒传输的bit数,单位为:bps(Bit Per Second)。
间接衡量声音质量的一个标准。
没有压缩的音频数据的比特率 = 采样频率 * 采样精度 * 通道数。 - 码率 : 压缩后的音频数据的比特率。常见的码率:
96kbps:FM质量
128-160kbps:一般质量音频。
192kbps:CD质量。
256-320Kbps:高质量音频
码率越大,压缩效率越低,音质越好,压缩后数据越大。
码率 = 音频文件大小/时长。
帧长
在音频处理中,"帧"的概念确实不像视频帧那样直观,因为音频帧不直接对应于视觉上的图像。音频帧通常是一段时间内的一组采样点,这些采样点被一起编码和处理。
- 每帧采样数播放的时间 :
- 这是指一帧音频包含的采样点数,以及这些采样点在播放时对应的时间长度。
- 例如,MP3编码中,每帧可能包含1152个采样点,如果采样频率是48kHz,那么每帧的播放时间是
1152 / 48000 = 0.024
秒,即24毫秒。 - 对于AAC编码,每帧通常包含1024个采样点,其播放时间取决于采样频率。
- 压缩后每帧的数据长度 :
- 这指的是经过编码和压缩后,每帧音频数据的大小。这个大小取决于编码算法和压缩率。
每帧持续时间计算
- 每帧持续时间(秒) = 每帧采样点数 / 采样频率(Hz)
- 这个公式可以用来计算任何给定采样频率和每帧采样点数的音频帧的持续时间。
交错模式与非交错模式
- 交错模式(Interleaved) :
- 在交错模式下,音频数据是按照帧的顺序存储的,即先记录一帧的左声道样本,然后是同一帧的右声道样本,接着是下一帧的左声道样本,依此类推。
- 示例:
L R L R L R ...
- 这种模式在存储和传输立体声或多声道音频时很常见。
- 非交错模式(Non-interleaved) :
- 在非交错模式下,首先记录一个周期内所有帧的左声道样本,然后记录所有帧的右声道样本。
- 示例:
L L L L ... R R R R ...
- 这种模式在某些特定的音频处理应用中使用,例如在处理独立声道时。
六、封装格式
封装格式(也叫容器)就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中,便于软件播放。一般来说,视频文件的后缀名就是它的封装格式。封装的格式不一样,后缀名也就不一样。
比如:同样的陷可以做成饺子也可以做成包子。对于视频也是一个道理,同样的音视频流可以用不同容器来承载。
封装格式的特点:
- 组合性:封装格式可以将多个编码后的媒体流组合在一起,这些流可以是不同类型和格式的,例如H.264编码的视频流、AAC编码的音频流等。
- 互操作性:封装格式允许不同的播放器和设备播放同一文件,只要它们支持该封装格式。
- 扩展性:许多封装格式支持额外的数据,如字幕、元数据等,这些数据可以与视频和音频流一起存储。
后缀名与封装格式:
- 通常,文件的后缀名表示该文件使用的封装格式。例如:
.mp4
表示 MPEG-4 Part 14 封装格式。.avi
表示 Audio Video Interleave 封装格式。.mkv
表示 Matroska 封装格式。.flv
表示 Flash Video 封装格式。
封装格式的重要性:
- 封装格式对于确保媒体内容的可访问性和便捷性至关重要。它们使得用户可以在不同的设备上轻松播放同一媒体文件,而无需关心底层的编码细节。
例如:
七、音视频同步概念
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但存在B帧的时候两者的顺序就不一致了。
DTS(解码时间戳):
- DTS是给解码器提供的信息,指示应该在何时开始解码特定帧的数据。
- 它确保了帧能够按照正确的顺序进行解码,尤其是在存在依赖关系的帧(如P帧和B帧)的情况下。
- DTS的顺序通常与帧的编码顺序一致,即按照帧在编码流中的出现顺序。
PTS(显示时间戳):
- PTS是给播放器提供的信息,指示应该在何时显示特定帧的数据。
- 它确保了帧能够按照正确的时间顺序显示给观众,即使这些帧的解码顺序因为编码优化(如B帧的存在)而与显示顺序不同。
- PTS的顺序反映了帧应该呈现给用户的顺序,这与实际的观看体验直接相关。
B帧对DTS和PTS的影响:
- 当视频流中存在B帧时,由于B帧是双向预测帧,它们依赖于前后的I帧或P帧进行解码,但它们的显示时间却在这些依赖帧之前。
- 这导致DTS和PTS的顺序不一致。DTS按照解码顺序排列,而PTS按照显示顺序排列。
- 例如,如果视频流是这样的:I帧(DTS=0, PTS=0)-> P帧(DTS=1, PTS=1)-> B帧(DTS=2, PTS=0.5),那么B帧虽然是在P帧之后编码的,但其PTS却比P帧的PTS小,因为它应该在P帧之前显示。
为什么要区分DTS和PTS:
- 区分DTS和PTS是为了优化视频流的编码效率和播放体验。通过允许解码顺序与显示顺序不同,可以在不牺牲视频质量的情况下减少数据量,提高压缩率。
- 同时,这也有助于播放器正确地同步音频和视频,确保用户获得流畅的观看体验。
同步的三种模式
在音视频处理和播放中,同步是确保音频和视频内容正确对齐的关键。不同的同步模式适用于不同的场景和需求。以下是三种同步模式的简要说明:
- Audio Master(音频为主) :
- 在这种模式下,视频播放的节奏和时序是由音频流控制的。
- 如果音频和视频之间存在时间差,播放器会调整视频的播放速度或暂停来匹配音频流,确保音频的流畅性。
- 这种模式通常用于音频内容至关重要的情况,如音乐视频或现场表演。
- Video Master(视频为主) :
- 在视频为主的模式下,音频流会调整以匹配视频流的节奏和时序。
- 如果音频和视频之间存在时间差,播放器会调整音频的播放速度或暂停来匹配视频流,确保视频的流畅性。
- 这种模式通常用于视频内容至关重要的情况,如电影或剧情片。
- External Clock Master(外部时钟为主) :
- 在外部时钟为主的模式下,音频和视频的播放都同步到一个外部时钟信号。
- 这种模式通常用于专业广播和现场演出,其中有一个精确的外部时钟信号(如LTC - Longitudinal Time Code)用于同步所有的音视频设备。
- 这种同步方式可以提供非常精确的同步,但需要专门的硬件和精确的时间码信号源。
在实际应用中,选择哪种同步模式取决于具体的应用场景、内容类型以及设备或系统的要求。正确的同步设置可以确保音视频内容的自然流畅,提高观众的观看体验。
至此,结束~
望诸位不忘三连支持一下~