关于音视频相关的知识非常多,建议去看看雷神的blog。介绍了很多基础知识,站在巨人的肩膀上。
通常看见的视频格式mp4、avi、rmvb等是把视频和音频按照一定的格式封装的结果称为封装格式,我们看到的有画面有声音的视频实际上视频和声音都是单独的,只是把两个做了同步。
原始的视频像素数据(RGB,YUV等)是会被压缩成视频码流,从而降低视频的数据量。如果视频不经过压缩编码的话,体积通常是非常大的,一部电影可能就要上百G的空间。视频编码是视音频技术中最重要的技术之一。视频码流的数据量占了视音频总数据量的绝大部分。高效率的视频编码在同等的码率下,可以获得更高的视频质量。
主要视频编码一览
H.264仅仅是一个编码标准,而不是一个具体的编码器,H.264只是给编码器的实现提供参照用的
数据压缩分类
● 无损压缩(Lossless)
○ 压缩前解压缩后图像完全一致X=X'
○ 压缩比低(2:1~3:1)
○ 例如:Winzip,JPEG-LS
● 有损压缩(Lossy)
○ 压缩前解压缩后图像不一致X≠X'
○ 压缩比高(10:1~20:1)
○ 利用人的视觉系统的特性
○ 例如:MPEG-2,H.264/AVC,AVS
空间压缩:比如 一块红色区域,原本有1000个红色像素,现在只要200个就能显示这块红色区域。
时间压缩:比如电影中一副画面停顿了10s,只需要一帧画面来描述这10s,不用原来的全部画面,因为画面都一样。
编码压缩:定长编码和变长编码。
上面是视频播放的整个流程,如果在线播放就需要先解协议,播放本地视频就不要这一步。播放器需要把压缩的视频数据,解压成原始数据再进行播放。
下面就实现一个小功能,把封装的MP4视频解封装然后解码成原始的YUV格式数据
给结构体AVPacket分配内存,并初始化,但是结构体中的视频数据是空的,也要先给视频数据分配内存(缓冲区)avpivture_fill 来实现这个功能,后面才能在这个缓冲区中添加数据
网友评论