YUV+RGB+H264+RTSP总结
原链接:https://blog.csdn.net/weixin_43166958/article/details/89357097
YUV
YUV 是传统的黑白电视,没有uv数据即是黑白电视。YUV更便于视频信号的压缩、传输和存储
从视频采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264、MPEG视频编解码)的角度来说,也是在原始YUV码流进行编码和解析。
YUV,分为三个分量,Y:表示明亮度(Luminance或Luma),也就是灰度值;而 U 和 V :表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
YUV是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
采样方式
YUV码流的存储格式其实与其采样的方式密切相关,主流的采样方式有三种:
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
YUV 格式可以分为打包格式packed format和平面格式planar format。打包格式将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而平面格使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。Packed format和planner format的区别在于,packed format中的YUV是混合在一起的,因此就有了UYVY、YUYV等等,他们在码流中排列的方式有所不同。而对于planner format每一个Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量都在Y分量之后出现,而V分量在所有的U分量之后。就像三个大色块一样。
存储方式
(1) YUVY 格式 (属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr, 其中,Cb、Cr的含义等同于U、V。
(2) UYVY 格式 (属于YUV422)
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已
(3) YUV422P格式 (属于YUV422)
YUV422P也属于YUV422的一种,它是一种Plane模式,即打包模式,并不是将YUV数据交错存储,而是先存放所有的Y分 量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量
(4)YV12,YU12格式(属于YUV420)
YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。
YV12格式与IYUV类似,每个像素都提取Y,在UV提取时,将图像2x2的矩阵,每个矩阵提取一个U和一个V。
RGB
RGB是最直观的静态画面(彩色的LED灯,液晶屏幕),可以说RGB是用来在LCD、CRT上显示用的
计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red)、G(Green)、B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红、绿、蓝磷光材料发光而产生色彩。当记录及显示彩色图像时,RGB是最常见的一种方案。但是,它缺乏与早期黑白显示系统的良好兼容性。因此,许多电子电器厂商普遍采用的做法是,将RGB转换成YUV颜色空间,以维持兼容,再根据需要换回RGB格式,以便在电脑显示器上显示彩色图形。
自然界中几乎所有的颜色都能用三种基本彩色混合配出,在彩色电视技术中选择红色、绿色、和蓝色作为三基色。其他的颜色都可以用红色、绿色和蓝色按照不同的比例混合而成。所选取的红色、绿色和蓝色三基色空间。简称为RGB颜色空间。
RGB565 每个像素用16位表示,RGB分量分别使用5位、6位、5位
RGB555 每个像素用16位表示,RGB分量都使用5位(剩下1位不用)
RGB24 每个像素用24位表示,RGB分量各使用8位(注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…)
RGB32 每个像素用32位表示,RGB分量各使用8位(剩下8位不用)
ARGB32 每个像素用32位表示,RGB分量各使用8位(剩下的8位用于表示Alpha通道值)
H264
H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。
H.264是一种压缩算法,你给它什么数据都能压缩,但是它是有损压缩,所以要进行H264编码要先把数据转换成YUV图像格式的才可以 H.264的码流结构网络适应性强,增加了差错恢复能力,能够很好地适应IP和无线网络的应用。
H.264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
帧内(Intraframe)压缩也称为空间压缩(Spatialcompression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。
帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩(Temporalcompression),它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值(Framedifferencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
H264在视频采集到输出中属于编解码层次的数据,如图所示,是在采集数据后做编码压缩时通过编码标准编码后所呈现的数据。
H264分为两层:
VCL(Video Coding Layer)视频编码层:VCL为被压缩编码后的视频数据序列,负责高效的视频内容表示
NAL(Network Abstraction Layer)网络提取层:负责以网络所要求的恰当的方式对数据进行打包和传送
码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。
分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
分辨率常用的有:
720x480(标清480p)
1280x720(高清720p)
1920x1080(全高清1080p, 19202 * 10802 = 4k)
3840x2160(八百万像素的超高清4k,往上再4倍就是8k超高清)
其实含480p以下为标清,480p以上为高清,经典的有720p、1080i、1080p,1080p又称全高清,1080p以上都为超清。(i隔行扫描多用于电视机信号,p逐行扫描)
帧率:
在1秒钟时间里传输的图片的帧数,影响画面流畅度,常说的24帧电影、在游戏上的FPS,都是这个概念,通常手机上20帧左右即可。
ps:Gop是指多少秒一个I帧。
码率:
右键看一个视频的属性,详细里有一个总比特率,计算方式是:
【码率】(kbps)=【文件大小】(字节 )X8 /【时间】(秒)
我们接收的到的图像信号一般是H.264格式的,移动设备接收到后,需要先解码成原始的YUV码流,然后又转换成RGB码流,将一帧一帧的RGB数据放到显存上才能显示出图像。而YUV到RGB的转换,很多ARM芯片上都有了。
RTSP
RTSP(Real Time Streaming Protocol), 基于文本的多媒体播放控制协议,是一个实时流传输协议
----它是TCP/IP协议体系中的一个应用层协议
----它是对流媒体进行控制 的网络控制协议,可以对流媒体提供诸如播放、暂停、快进、停止等操作,它负责定义具体的控制消息、操作方法、状态码等,此外还描述了与RTP间的交互操作。
----但是,实时流的传输并不是它负责,而是交给RTP、RTCP协议。
----RTSP发送的指令一般通过TCP进行传输,以保证服务端会收到。
----而在RTP/RTCP协议下实时流的传输 通过UDP传输,以保证数据的实时性。在实际情况下,是允许实时流少量的丢帧。
----RTSP为取流协议,取到码流后需要解码显示
RTSP作为一个应用层协议,提供了一个可供扩展的框架,使得流媒体的受控和点播变得可能,它主要用来控制具有实时特性的数据的发送,但其本身并不用于传送流媒体数据,而必须依赖下层传输协议(如RTP/RTCP)所提供的服务来完成流媒体数据的传送。RTSP负责定义具体的控制信息、操作方法、状态码,以及描述与RTP之间的交互操作。RTSP媒体服务协议框架如下:
RTSP传输的一般是H264、TS、MP4格式的流,其传输一般需要2~3个通道,命令和数据通道分离。使用RTSP协议传输流媒体数据需要有专门的媒体播放器和媒体服务器,也就是需要支持RTSP协议的客户端和服务器。
个人总结:
用海康威视的摄像实时读取视频,读取视频的格式是YV12格式,摄像机进行压缩算法处理后的H264视频流通过RTSP协议传向网络应用层,用户拿到的数据是H264格式,需要用ffmpeg软解码或者arm9等硬解码,得到原来的YV12格式的图像视频,最后经过opencv处理得到RGB格式显示到屏幕。