视频编解码测试
基本知识
RGB三色,每色有8bit,这种方式表达出来的颜色,也被称为24位色(占用24bit)
而之所以会有视频编码,关键就在于此:一个视频,如果未经编码,它的体积是非常庞大的。
以一个分辨率1920×1080,帧率30的视频为例:
共:1920×1080=2,073,600(Pixels 像素),每个像素点是24bit(前面算过的哦);
也就是:每幅图片2,073,600×24=49,766,400 bit,8 bit(位)=1 byte(字节);
所以:49766400bit=6220800byte≈6.22MB。
这是一幅1920×1280图片的原始大小,再乘以帧率30。
也就是说:每秒视频的大小是186.6MB,每分钟大约是11GB,一部90分钟的电影,约是1000GB,我们编码的终极目的,说白了,就是为了压缩.
采集了视频数据之后,就要进行模数转换,将模拟信号变成数字信号。信号输出之后,还要进行预处理,将RGB信号变成YUV信号
简单来说,YUV就是另外一种颜色数字化表示方式。视频通信系统之所以要采用YUV,而不是RGB,主要是因为RGB信号不利于压缩。在YUV这种方式里面,加入了亮度这一概念。在最近十年中,视频工程师发现,眼睛对于亮和暗的分辨要比对颜色的分辨更精细一些,也就是说,人眼对色度的敏感程度要低于对亮度的敏感程度。所以,工程师认为,在我们的视频存储中,没有必要存储全部颜色信号。我们可以把更多带宽留给黑—白信号(被称作“亮度”),将稍少的带宽留给彩色信号(被称作“色度”)。于是,就有了YUV。
视频编解码:
编码:就是按指定的方法,将信息从一种形式(格式),转换成另一种形式(格式)。视频编码:就是将一种视频格式,转换成另一种视频格式。
所谓编码算法,就是寻找规律,构建模型。视频编码技术优先消除的目标,就是空间冗余和时间冗余
封装格式MP4 编码格式H.264
封装格式常有:MP4、AVI、MOV、FLV他们和视频质量没有关系。
码率:决定视频质量和大小。码率减少51-74%的情况下,H.265编码视频的质量还能与H.264编码视频近似甚至更好
H.264
- I帧:关键帧。视频序列中的第一个帧,始终都是I帧
- P帧 :根据I帧预测出来的预测帧(记录I帧发生的变化)
- B帧:双向预测帧(记录前后I、P帧的变化)因为依赖后面的帧,所以不适合实时传输(例如视频会议)。
H.265(HEVC)是基于H.264(AVC)制定的新的视频编码标准.提高压缩效率、提高鲁棒性和错误恢复能力、减少实时的时延、减少信道获取时间和随机接入时延、降低复杂度等。H.265标准也同时支持4K(4096×2160)和8K(8192×4320)超高清视频。可以说,H.265标准让网络视频跟上了显示屏“高分辨率化”的脚步。
视频数据的封装
对于任何一部视频来说,只有图像,没有声音,肯定是不行的。所以,视频编码后,加上音频编码,要一起进行封装。
封装:就是封装格式,简单来说,就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中。再通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个饭盒,用来盛放饭菜的容器。
目前主要的视频容器有如下:MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。
封装之后的视频,就可以传输了,你也可以通过视频播放器进行解码观看
FFmpeg
提取YUV数据:
ffmpeg -i input.mp4 -pix_fmt yuv420p -f rawvideo output_yuv420p.yuv
-i input.mp4
输入视频文件 ;
-pix_fmt yuv420p
设置提取后的输出文件的数据格式为 YUV420P 像素格式 ;
-f rawvideo
设置 输出的数据格式 为 原始视频数据 ;
output_yuv420p.yuv
设置 输出文件的 文件名称 ;
通过 -t
参数 , 设置提取前 3 秒的视频数据 ,
通过 -s
参数 , 设置 提取 320x240 大小的视频画面 数据
播放YUV:
ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 -i output_yuv420p.yuv
- 尺寸 : 通过
-video_size
参数设置 ; - 帧率 : 通过
-framerate
参数设置 ; - 具体像素格式 : 通过
-pixel_format
参数设置 ;
PPI
PPI,就是“Pixels Per Inch”,每英寸像素数。也就是,手机(或显示器)屏幕上每英寸面积,到底能放下多少个“像素点”。这个值当然是越高越好啦!PPI越高,图像就越清晰细腻。