视频采集
本帖最后由 h1654155283.0188 于 2024-4-28 20:57 编辑
图像是比文字更高级的信息存储方式,就像人用双眼去感知世界,图像将那一个瞬间的画面存储了起来。视觉的颜色是通过基础色合成的,这三个基础色就是类似人眼中的三种视锥细胞(红绿蓝三色),任何一个颜色都可以通过rgb三元组组成。在计算机的世界里,每个分量,可以通过八位的二进制数表示,这样就会一共有二的二十四次方种组成。
在不同的行业中,会有不同的方式去描述颜色,我们需要将颜色空间中的样本与现实世界中的真实颜色对应起来,就要精确的用每一种二进制对应真实的颜色,形成颜色空间的标准与RTC密切相关的颜色空间是YUV,Y表示亮度,可以表示为灰度值,U和V表示色度和浓度,这样的编码方式有两个好处,由于人眼对亮度特别敏感,对U和V不敏感,因此可以对UV进行下采样,只保留原先的一半或1/4,对YUV的后续编码,可以采用不同的压缩策略。
颜色分量组成了一个像素,一个颜色像素的二维数组就可以形成位图。最基本的位图是bmp格式的,它由头文件信息头、可选的位屏蔽、颜色表及像素数组构成,像素数组实际上存储的就是rgb的每一个像素的颜色。RGB24是众多像素格式中最基本的一种。
图像的采集方式有很多种,照相机就是延续至今的一种方式。视频采集的第一步就是要识别出这些采集设备,例如在WINDOWS上,我们通过设备枚举识别设备,实际上,最终这些数据都会转换到C++层进行统一的处理。图像采集都有哪些参数呢?对于摄影来说重要的参数,有光圈、快门、感光度这些,拍照的参数会影响成像效果。对于RTC而言,我们关心的是采集参数中的分辨率,帧率,像素格式,也就是图像的大小,每秒采集的图像数以及硬件输出的数据帧格式。不同的平台都有获取数据帧的标准流程和方法,在RTC应用中,需要获取数据帧的原始数据,以便后续的转换处理。例如,我们构建的graph:
通过这个简单的定义,将原设备的接收帧数据进行回调,并把视频数据读取出来。不同的平台所用的API可能是不太一致的,但是都可以通过这个平台采集接口进行统一获取。
在获取视频帧的方式中,摄像头只是其中的一种来源,还可以通过屏幕流和外部源进行获取,屏幕流也就是咱们电脑桌面的窗口,外部源就是外部的媒体文件。windows系统的屏幕采集技术已经发展到了第四代,在win10中可以通过WGC进行视频采集。其他的开发平台或者是系统中也有对应的接口。
以上获取的只能说是原始的视频数据,我们在采集到后还要进行逻辑处理,例如加入时间戳、计时等等,时间戳的选取需要考虑以哪个时间点为基准,用什么样的时间单位。在rtc的采集帧上,我们使用固定时钟并用纳秒为单位;在rtp包中时间戳使用32位值;对于音频帧其单位为采样率的倒数。
旋转角是视频帧的一个重要的属性,会写在每张照片的标签中,在显示前需要先转为正向也就是说人眼观察到的物体,与图像要保持一致。镜像问题在rtc应用中也需要一个约定俗成的习惯,无论摄像头是前置的还是后置的,当使用者旋转自己的手机时,自己的预览画面始终是正向在PC机上,摄像头通常都不会做镜像,在预览自己的画面时需要人为处理。我们在使用设备时要注意旋转角以及设备的朝向,必要时要进行相应的计算。获取的原始数据在经过采集好的视频帧加入时间戳和旋转角信息后,还要进行视频前的处理工作,例如格式的转换,帧大小的调整,焦点以及裁剪,是否需要加入一些特效等等,对画面的噪点需要进行处理。
接下来就要对视频进行渲染视频渲染,实际上就是将二进制数据呈现在显示设备上的过程,其通常使用gpu进行计算,渲染的过程涉及多个方面,包括渲染设备渲染技术,渲染,流水线等等。渲染设备,接触的最多的就是显卡了,其负责计算和渲染。显示器就是用于渲染后的图像的显示,还有很多,例如投影仪VR眼镜,手机屏幕等等,这些都是显示器件。人眼观察的最低要求一般是60赫兹,渲染的过快,会使人眼无法分辨过低,则会出现闪烁和不流畅。在2000年以来渲染技术主要是实时渲染与图形加速,实时渲染,主要用于游戏等,高速动画领域,现在也有一些新技术,例如,光线追踪等等,都可以给计算机带来更高的渲染质量和视觉效果。在进行跨平台渲染时,需要用到OpenGL,着色器编程是OpenGL中一个重要的组成部分,通过编写着色器程序来定义图片渲染管线的各个阶段的操作。实际上,着色器的程序是在显卡上执行的小型程序,获得最终的像素颜色。数字视频目前已经发展到超高清视频阶段,数字视频在娱乐,通信,广告,教育等领域发挥着越来越重要的作用。目前存在几种主流的视频格式提在编码方式压缩,要支持的功能和适用场景上都存在着一定差异。
更多回帖