首先,向雷霄骅致敬
必备知识:
c语言 及其 开发环境
视频播放器的原理
播放视频文件的流程:
封装格式数据(即FLV、MKV、MP4等等视频文件)
通过 解封装格式 将视频数据和音频数据进行解析
得到 音频压缩数据(aac mp3 等) 和视频压缩数据(h.264 mpeg2 等)
(需要注意的是,这些压缩数据 占用内存空间小,而视频压缩数据又称码流,不能直接用于显示)
音频
音频压缩数据 进行 音频解码 得到 音频采样数据 (即 pcm等)
同样 视频也是类似的
视频压缩数据 进行 视频解码 得到 视频像素数据(即 yuv 等)
然后,将视频像素数据 和音频采样数据 进行 视音频同步 从而呈现给我们视频和音频享受
备注:
1.通过mediaoinfo能够看到文件的一些常用信息 比如 视频格式 音频 平均混合码率等 视频分辨率 音频采样率
2.视频封装格式中的 MPEG2-TS格式 特点:不包含文件头,由数据大小固定的ts packet组成,所以此类型的文件如果文件头丢失,也能正常播放;另一种 FLVg格式 特点:包含文件头,数据有大小不固定的tag构成,所以正因为有文件头,所以当文件开头丢失的时候就会导致不能正常播放。
3.上面说的视频编码数据,其实是对视频像素数据(RGB YUV等)压缩成的视频码流,从而降低视频的数据量,一般如果直接用视频像素数据存储视频的话,会占用很多物理空间。 目前最常用的,就是H.264,目前90%都在使用h.264视频编码格式,而MPEG2 现在一些数字电视在使用。查看视频编码格式的软件有Elecard Stream Eye
h.264编码格式
他的存储方式是将视频的画面按照单位存储,即1帧画面经过压缩编码后,存储到1个NALU单位中,但是他的压缩方法很复杂,包含了帧内预测、帧间预测、熵编码、环路滤波等环节构成。比较复杂,所以暂不深究。
H.264的优点是可以将图像数据压缩至100倍以上,即100m的图像数据可以用其压缩至1m。
可见h264编码格式比较负责,她首先将视频图像进行网格划分,然后对于复杂的图像,再进行网格划分,计算获取图像的运动矢量等信息其中I帧 会把图像直接进行存储,而P帧会预测运动矢量,跟I帧进行参考,B帧跟P帧类似但做的事情更多。
音频编码数据
作用:将音频编码数据(pcm等)压缩成音频码流,从而降低音频的数据量,但是其实不需要压缩,也能够播放。
aac目前是主流
AAC存储方式是由大小不固定的ADTS构成,压缩方法比较复杂,可以将音频数据压缩10倍以上
视频像素数据(视频解码之后的数据,体积会变大100倍,像素数据就是送给显卡用于显示的数据)
作用:
保存了从屏幕左上角开始知道所有每个像素点的像素值
常见的格式:RGB24,RGB32,YUV420P,YUV422P,YUV444P(Y包含亮度信息,UA包含色度信息,YUV对色度信息采用更狠的压缩方案,从而提高压缩效率,因为人眼对亮度敏感,二队色度不太敏感uv的值只有y的1/4)
最常用的是YUV420P.
特点:视频像素数据体积很大,一般情况下1小时高兴视频的RGB24格式的数据体积为
3600*25*1920*1080*3=559.9Gbyte(假定帧率为25HZ,取样精度8bit,RGB是每个像素点占用3字节)
YUV格式像素数据查看工具是:YUV player
音频采样数据(音乐中记录声音的数据)
作用:保存了音频中的而每个采样点的值
特点:音频采样数据体积很大,一般情况下一首4分钟的pcm格式的歌曲体积为
4*60*44100*2*2=42.4MByte(假定采样率44100Hz,采样精度为16bit,立体声道)
PCM查看工具:Adobe Audition
下方是我的微信公众号,关注获取更多学习资源
image