我们现在平时所看到的视频,从摄像头数据采集到最后显示频显示出来,初略的归纳经过了下面的几个环节:摄像头采集图像数据->将图像数据进行压缩->将压缩的图像数据封装成视频格式。视频格式文件->去除视频格式封装->解压缩图像数据->得到一帧图像的数据->显示器显示图像。
这里只介绍摄像头数据的采集以及将采集到的数据压缩成视频流的一些操作。
摄像头输出三类数据:YUV,RGB,JPEG。YUV是大多数视频编码所需要的数据格式,比如X264编码器编码h264视频格式,它需要独立分离Y,U,V三个分量上的数据。RGB 数据可以直接发送到显示屏显示,通过R(红),G(绿),B(蓝),三色可以组合成其它的各种颜色。显示屏最后都是通过RGB数据格式把颜色显示出来。JPEG是一种经过压缩的图片格式,为了减少数据量,在有些摄像头内部它就可以进行图片的压缩,一帧JPEG格式的数据直接保存成文件就是一张JPG的图片,把一系列JPEG的图片依循存储就是MJPEG格式的视频格式了。与x264编码相比,MJPEG编码清晰度较高,但是数据量较大(压缩率低,失真率也低)
三种类型数据:
摄像头输出YUV数据
YUV数据分很多种,比如YUV420,YUV422,YUV422P等等,对于有些视频编码,它只能输入YUV数据。比如X264编码器编码h264视频格式数据,它需要输入Y,U,V三个分量的具体数据。一帧图像的YUV数据并不能像图片一样查看,需要专门的YUV查看软件查看,比如pYUV。YUV数据的具体定义网上有很多资料这里不再介绍,下面是对YUV数据的具体使用。
摄像头输出RGB数据
RGB数据是摄像头采集到的原始颜色数据,这种数据主要是提供给图像处理器进行图像ISP效果的处理,这里待以后有时间在研究。
摄像头输出JPEG数据
JPEG数据是摄像头采集到图像数据后,在摄像头传感器中就已经进行了一次压缩处理。将摄像头输出的一帧JPEG数据保存成文件,就是一张图片。可以将采集到的数据直接封装成视频格式,使用视频播放器就可以直接播放。与h264编码相比,h264虽然压缩的数据比利非常大,但是它的图像失真也是比较明显的。使用MJPEG封装的视频,清晰度高但数据量大。
数据格式转换
在实际使用的过程中,由于设备的受限,有些摄像头可能只支持JPEG格式输出,有些摄像头可能只支持YUV422格式输出,这里就会涉及到数据数据格式的一个转换。如果是在PC机或是手机上,这个很好处理,直接安装FFMPEG就可以把问题解决,因为FFMPEG提供和很多可以使用的接口。但是在嵌入式设备中,可能安装不了FFMPEG,那么就需要自己设计程序进行数据格式的转换了。
设备移植
最后提供一个设备移植的实例