1.视频文件是什么?
FLV, MKV, MP4是不同的视频后缀名,不同的视频格式就像一个容器。容器里封装的是音视频流。
FFmpeg:一款开源软件,用来处理音视频,对音视频进行编解码。要在Android中使用FFmpeg,需要下载源码,然后通过ndk进行编译,编成Android可以用的版本。
FFmpeg需要到官网下载,根据自己的系统选择适合的开发版本。下载好后包含三个应用程序:
ffmpeg:对音视频进行编解码操作。
ffplay:播放器。
ffprobe:音视频的分析工具。
ffplay -i 文件路径 :播放音视频文件。
ffplay -i 文件路径 -vst 1:播放音视频文件中的第一个画面。
音视频文件都可以存放多路音视频流。
从视频文件中拿到的不一定是完整的图像,可能某一个图像的数据记录的是跟前一幅图像的区别信息,这样的一幅图像不能直接转化为视频进行播放,所以需要对这幅图像进行解码,然后得到一幅完整的图像进行展示。即需要根据两幅图像进行图像整合,这个过程叫做解码。
2.为什么要进行编解码操作?
视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。
明明可以同时保存两幅图像的完整信息,却选择保存一幅图像相对于另一幅图像的差异点,这样做的优点就是节省空间。如果一段视频不经过编码处理,只采用原始图像的方式保存,会导致数据量过大,所以要进行编码处理。编码就是对数据进行压缩的过程。
在用编码对图像进行处理时,会存在一定的差异性,最后编码出来的数据会得到不同类型的压缩图像,这些类型有I P B帧。
I帧:帧内编码帧,关键帧,I帧可以看作一个图像经过压缩后的产物,可以单独解码出一个完整的图像;
P帧:前向预测编码帧,记录了本帧跟之前的一个关键帧或P帧的差异信息,解码完整的信息需要参考前一个I帧的信息,即解码时需要用之前缓存的画面(I帧)叠加上本帧定义的差别,生成最终画面(解码P帧的过程);
B帧:双向预测编码帧,记录了本帧与前后帧的差别,解码需要参考前一个I帧或P帧,同时需要后面的P帧才能解码一张完整的图像。
3.如何编码?
编码的目的就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输,编码的核心思想就是去除冗余信息。
空间冗余:图像内部相邻像素之间存在较强的相关性多造成的冗余。
时间冗余:视频图像序列中的不同帧之间的相关性所造成的冗余,即相邻图像只需要记录差异之处,而相同之处的记录就造成了时间冗余。
视觉冗余:人眼不能感知或不敏感的那部分图像信息。
信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特数要大,他们之间的差距就是信息熵冗余,或称编码冗余。
知识冗余:指在图像中还包括与某些验证知识相关的信息。