关于帧、帧数、帧率的概念
帧 Frame
简单的理解帧就是为视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧。
具体地,在将光信号转换为电信号的扫描过程中,扫描总是从图像的左上角开始,水平向前行进,同时扫描点也以较慢的速率向下移动。当扫描点到达图像右侧边缘时,扫描点快速返回左侧,重新开始在第1行的起点下面进行第2行扫描,行与行之间的返回过程称为水平消隐(也叫行消隐,H_BLANK)。一幅完整的图像扫描信号,是由水平消隐间隔分开的行信号序列构成,称为一帧。
如下图所示,是一帧的结构图,在最下面部分有一部分是V_BLANK。V_BLANK的由来是因为扫描点扫描完一帧后,要从图像的右下角返回到图像的左上角,开始新一帧的扫描,会有一段间隔时间,这一时间间隔,叫做垂直消隐(也称场消隐,V_BLANK),V_BLANK的作用通常用来调节帧率。
帧数 Frames
帧数是帧生成数量的简称,可以解释为静止画面的数量,也就是说,如果一个动画的帧率恒定为 60 帧每秒(fps),那么它在一秒钟内的帧数为 60 帧,两秒钟内的帧数为 120 帧。值得说的是对于我们大多数手机视频拍摄能力,无论是 720P 还是 1080P 基本都只有 30 帧每秒,因为这个将涉及到手机 GPU 图形处理器的能力和存储能力,这都是受手机硬件条件的影响,当然一些手机也可以拍出 4K 视频,甚至可以使用 135 帧每秒的超高速拍摄功能。
帧率 Frame rate
帧率(Frame rate) = 帧数(Frames)/时间(Time),单位为帧每秒(f/s, frames per second, fps)
帧率是用于测量显示帧数的量度,测量单位为“每秒显示帧数”( Frame per Second, FPS)或“赫兹”( Hz),一般来说 FPS 用于描述视频、电子绘图或游戏每秒播放多少幀。
FPS( Frame per Second)每秒显示帧数
FPS 是图像领域中的定义,是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。 FPS 是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的动作就会愈流畅。通常,要避免动作不流畅的最低是 30 。某些计算机视频格式,每秒只能提供 15 帧。
FPS 也可以理解为我们常说的“刷新频率”或者“刷新率”,使用“赫兹”( Hz)为单位。最简单的就是我们玩儿 LOL 英雄联盟、 CS 、以及手机上的王者荣耀等游戏中说的“ FPS 值”。而在显示器的刷新率中,如果你使用过那种很笨重的 CRT 显示器,那么你一定经历过将刷新率调低后,看着整个画面都是在闪烁的,所以当时的显示器的刷新率最大也就只有 60Hz,而现在子凡随便一看都是 150Hz 了,但是也会更具显卡来设置,当然 60Hz 也够了。其中子凡说的 60Hz 的刷新率刷也就是指屏幕一秒内只扫描 60 次,即 60 帧/秒。
sensor逐行曝光基本原理
sensor逐行曝光从第一行开始曝光,一个行周期结束之后第二行才开始曝光。依次类推,经过N-1 行后第N 行开始曝光。第一行曝光结束后开始读出数据,读出一行需要一行周期时间(含行消隐时间,即H_Blank)。至第一行完全读出后,第二行刚好开始读出,依次类推,当第N-1 行读完后,第N 行开始读出,直到整幅图像完全读出。
与sensor曝光相关的计算
1. line_time的计算:
line_time的计算公式:line_time = line_length / pclk
和这个公式相关的是下面三个变量的定义先说下
a). line_length: 一行的长度(包含h_blank)
b). pclk: 是控制像素输出的时钟,即pixel采样时钟,单位MHz。表示是每个单位时间内采样的pixel数量
c). line_time: 曝光一行的时间
所以,曝光一行的时间等于一行的长度除以曝光一个像素需要的时间。
2. exposure_time的计算:
exposure_time的计算公式:exposure_time = exposure_line * line_time
同样和这个公式有关的几个定义先说下:
a). exposure_time: 曝光时间。指这一帧曝光了多长时间。
b). exposure_line: 字面意思是曝光行。值得注意的是,曝光行不是指一次性曝光多少行,对于逐行曝光的sensor来说,永远都是一次曝光一行。所以,曝光行是指这一帧曝光了多少行。
c): line_time: 曝光一行的时间
所以,可以用line_time即曝光一行的时间,乘以曝光了的行数exposure_line,等于整个曝光花费的时间。
注:
1) 调节exposure_time曝光时间是通过写exposure_line寄存器实现的;
2) 曝光时间以行长为单位
3. fps帧率的计算:
frame_length = Vsync = Dummy Line = VTotal = VTS = V_Size + V_Blank // 帧长; 不占用曝光时间
line_length = Hsync = Dummy Pixel = HTotal = HTS = H_Size + H_Blank // 行长; 会增加曝光时间
fps的计算公式:fps = pclk / (VTS * HTS )= pclk / (frame_length * line_length) = 1 / (frame_length * line_time)
注:fps即表示1秒内帧数,此公式中line_time单位是秒
同样和这个公式有关的几个定义先说下:
a). pclk: 是控制像素输出的时钟,即pixel采样时钟,单位MHz。表示是每个单位时间内采样的pixel数量
b). frame_length: 一帧的行数(包含v_blank)
c). line_length: 一行的长度(包含h_blank)
这里frame_length * line_length的意思是用一帧的行数乘以一行的长度,即相乘得到一帧图像总共有多少像素。pclk是像素时钟,单位是MHz。如100MHz,就表示每秒钟可以采集100M个像数。用pclk除以frame_length * line_length两者之积,即是算1秒钟内采集的100M个像数点可以分成多少帧(frame_length * line_time = 曝光一帧的时间)。
注:
1). line_time一组setting只有一个值,一般是不变的,可看做常数,所以调节帧率是通过写frame_length寄存器,即调节frame_length实现的。
2). 同理,回到上一个知识点 2. exposure_time的计算:可以发现,exposure_time = exposure_line * line_time,而line_time一般是常数。所以,调节exposure_time曝光时间是通过写exposure_line寄存器实现的,即通过写曝光实现。
4.其他相关:
dummy_line:用来填充v_blank的行
frame_offset:最小的dummy_line,一帧曝光结束到下次准备好重新开始曝光的时间
frame_length = exposure_line + dummy_line
frame_length ≥ exposure_line +frame_offset
链接:https://www.jianshu.com/p/6d99bafd9a94
来源:简书