Adapt what is useful, reject what is useless, and add what is specifically your own. --- Bruce Lee

视频帧率这个部分,虽然表面上蛮简单基础的,但是其实深挖起来,也够写大半本书的。我们还是秉承着温故知新的逻辑,从眼前的一些东西整理一下,也可能会有一些你不曾想到或深入的点。

帧率的含义

视频是由连续运动的图像播放而来的,不知道当时第一次把电影活灵活现的播放出来的时候,是不是现场看到过电影的人们一定是张大了嘴,瞪大了眼睛,世界也从此不同了。以下的这个1887年拍摄的最早期的视频为例,它是由15张300x200的图像组成,在1.5秒播放完成的。仔细看每张图的左下角,每一张都标注了它的图像号:

我们可以看到组成这个视频的所有画面。

每秒钟视频要播放的图片数,这个值即被定义为帧率,单位为fps(frames per second)。它不只在视频技术中被应用,也在动画、游戏、相机、显示设备等所有采集和显示有关的地方应用着。比如上面的视频,它的帧率为:

Video_Frame_Rate = 15 / 1.5 = 10fps

帧率标准

在电影电视发展早期,每个国家使用的帧率制式是有区别的,一个比较典型的设定是:

• 24fps(电影、ATSC、2k、4k、6k)

• 25fps(PAL(主要用在中国、欧洲、乌拉圭、阿根廷、澳大利亚等)、SECAM(中东、法国、东欧等)、DVB、ATSC)

• 29.97fps(NTSC(美洲、日本、韩国、东南亚等),ATSC、PAL-M(巴西))

• 30fps(ATSC)

造成这个局面的原因主要因为在黑白电视时代,各国家电网的不同,比如美国电力系统频率为60Hz(传输30fps信号),而中国、欧洲电力系统频率为50Hz(传输25fps信号),所以各国电视信号都按各国自己传输网络的情况进行了设定。彩色电视被发明之后,为了兼容黑白信号并防止出现显示异常,所以做了信号微调,把帧率调整到NTSC制式,即30/1.001 = 29.970。

但具体是如何将30fps的内容控制在29.970呢?这就不能不提一下timecode的概念。

timecode

早年间在拍电影的时候,因为有多个机位,多个摄像机采集的信号如何很难保证精准的对齐时间戳。这样在做后期的时候非常困难。timecode是在1967年由一家叫EECO的从事视频摄像机和视频后期视频的公司发明的,后来SMPTE采纳了这个概念,并将它标准化。它的格式非常直白:

这样不同内容间同步的问题被完美的解决掉了。而且你可以使用timecode定位到一个准确的视频帧。

这里需要明确一个点,因为每秒里的帧数有可能不确定,所以不能完全用timecode去推断帧率(而且两者概念不一样,timecode主要为了定位视频帧的,帧率主要是为了给录制和播放两侧图像显示速度的)。

29.97如何而来

这个问题的定义是我们如何在后期制作的环节获得29.97fps的内容,以保证完全的帧同步。

如果从内容生产端解决这个问题,可能会是个噩梦。因为不同种类的摄像机拍摄,设置不同,回来的内容就不可控,到了后期通过其他手段进行帧率填充成本极高(尤其在老式的视频编辑设备上)。所以这条路径被封死了。

于是大家想到了timecode,发明了Drop-Frame Timecode的方法。

具体的流程是这样的,如果你采集的信源是30fps,但是制作需要29.97fps,那么在每个10分钟区间里,除了第一分钟外,每分钟的前两个timecode的帧都被丢弃掉(即.00, .01两个帧)。这样的话,10分钟内的视频帧一共有:

TotalFrames = 10 x 60 x 30 - 9 x 2 = 17982 frames

所以最后的帧率为

OutputFrameRate = 17982 / (10 x 60) = 29.97 fps

这是个非常物理的设计,信源其实没有任何变化,但是输出却自动适配了。一方面跟原来30fps的黑白信号频率岔开了,另一方面帧率尽可能接近30fps,并达到了一个准确的值。这样的设计在那个半自动化半机械的年代里,有很多案例,由于当时的客观技术与平台因素制约,最终解决方案都给人一种工程美感。

这个事情在数字化之后,其实一来没有那么多制式的限制了,二来数字化时代,所有的采样灵活度更高,帧率设定大部分情况下,只是一个参数设置,软件可以做的事情越来越多,但了解历史会让人更清楚它的来龙去脉。

帧率多高算够

这个问题真没有特别明确的答案。

我们都知道物理上有个实验结果,大脑反应图像的速度接近于0.1秒每张。这个说明,人眼每秒可以处理10张到12张图片,并可以独立的识别与认知它们。如果一秒里包含了更多图像,它们将被认知为运动。而如果显示设备的显示频率较低的话,人眼会感觉到明显的闪烁,并随着暴露时间的变长产生严重的疲劳感。久而久之,将罹患比较严重的眼部疾病,或是严重的近视。

一般显示设备的亮度越高,人眼感觉不到闪烁需要的帧率越高,反之,越低。我们用电影银幕为例,无闪烁感要求关系如下:

所以显示器的刷新率一般至少都在50Hz以上。另外电影院因为屏幕亮度高,对于帧率的要求就更高,诺兰之类的大导演经常会要求120Hz的片源,会让人观看体验提升非常明显(越专业的人看到的提升越明显)。另外高帧率看惯了,低帧率就再也回不去了。

夜里关灯看手机也真的是影响眼睛,屏幕亮度高,近距离看,屏幕刷新率固定的,一定会有屏幕闪烁的感觉,一定会视疲劳,非常容易加深眼睛伤害。

目前看现在应用级别的视频,上限帧率应该是120Hz,特殊场景,如医学、微观世界研究,可能会需要更高的帧率,它们也不是像我们看电影这样快速的看,会放慢动作,看得更精细。所以回到我们的判断,没有明确的答案,只有应用场景的要求。

帧率是否有其他的研究点

Video Framerate Up Conversion

视频帧率提高(Video Framerate Up Conversion或Video Frame Interpolation等),是非常典型的一个研究点,这几年还在继续有一些新的技术产出。

一般做这个事情是出于两个目的:

• 在不改变信源的情况下,将原有视频内容以更高帧率展示,观感更平滑(加强运动感知),用在播放器上,提升观看体验

• 在不改变信源的情况下,将原有视频的帧数变多,以相对低的帧率进行展示,实现慢动作、慢镜头效果(Slomo),用在特效制作上,提出某些特效。

有一个比较老的项目,在帧率拉升上做的真的不错,叫SVPFlow[1]。它是运行在AviSynth上的一个效果插件,底层用到另外一个视频运动分析工具MVTools2[2],在绝大部分视频源上跑下来的结果都非常平滑(本身MVTools2这个插件也非常棒,在帧间运动分析上效果还是不错的,对于一些CV算法有帮助的)。

当然另外就是通过CNN等这些AI算法去进行更高级别的运动分析,然后生成新的视频帧。如2017年发表在CVPR上的Video Frame Interpolation via Adaptive Convolution[3],就是这样一个算法。这个算法作者也提供了开源的实现,有兴趣也可以到github项目页[4]去下载测试。

每个视频的算法,都有机会使用AI技术进行加强(当年参加ICME发文章的讲论文的时候,也是这么说,跟一个美国教授在探讨这个事情,他极不认可这个说法,这么多年过去了,各新的压缩标准已经把AI逐渐用在各个地方了,也算是给当年的一个判断的了断吧)。

Video Framerate Down Conversion

与提升视频帧率作用相反,大量的非编和后期软件现在都提供了这个功能,虽然它不能给人愉悦感,但是在某些场合下,是可以实现一些特效的,比如香港80年代鬼片里,经常会用到这种效果,然后再配个阴森的音乐,来给人一种害怕的感觉。案例效果太晦气,就不放在文章里了,大家有兴趣可以自行寻找。

写在最后

当我们沿着这个行业里最基础的这些部分一点点整理过去的时候,很多时候会发现过去的技术人跟现在的技术人关注点真的有比较大的差异了,有好多原来非常复杂的问题,现在变简单了或是更夸张,变没了。但是解决问题的思路没有变,解决问题的时候人的智慧给人带来的愉悦感没有变。

我有一本2008年从北航的一个二手书店里购买的《影视技术概论》,应该是当时某个专业里的教材,现在也只有二手书还有可能能买到了。当时购买人叫伊能,他买于2006年9月30日。书里还留着他的签名,以及他学习里详细的笔记,也不知道15年过去了,他在哪,现在怎么样。虽然里面的技术好多现在只用在电影制作里,但是里面的信息都扎根好深,说得好透。所以有时候真的感慨,技术发展那么快,基础技术是否受到关注度太低了。我们还是继续守好初心,在五年计划里,把能整理的一点点整理出来,也许会使有些人受益吧。

References

[1] SVPFlow: http://avisynth.nl/index.php/SVPFlow
[2] MVTools2: http://avisynth.nl/index.php/MVTools
[3] Video Frame Interpolation via Adaptive Convolution: https://arxiv.org/abs/1703.07514
[4] github项目页: https://github.com/sniklaus/sepconv-slomo

视频帧率的故事与一些细节相关推荐

  1. 视频帧率对人眼主观感受的影响 2

    Quan Huynh-Thu等人在论文<PERCEIVED QUALITY OF THE VARIATION OF THE VIDEO TEMPORAL RESOLUTION FOR LOW B ...

  2. opencv学习之视频帧率

    视频帧率指FPS值,FPS是测量用于保存.显示动态视频的信息数量.就是每秒中 视频变化的画面数.

  3. 前端获取视频帧率/帧数

    实现方案:     使用C语言书写解析MP4文件的方法,编译为wasm,与JS协同用来解析上传的MP4文件,获取视频帧数. 优:体积较小(共30KB) 缺:现在功能相当有限,只实现了MP4获取帧数的功 ...

  4. 视频帧率与显示刷新率

    固定帧率视频 固定帧率视频每帧的时长是固定长度的. 可变帧率视频 可变帧率的视频,每帧的视频时长不一定相同. 59.94.29.97.24.976 59.94 = 60/1001 29.97 = 30 ...

  5. 批量提取视频帧率及分辨率

    最近遇到一个需求,需要做一些frame rate conversion相关的工作,首先分析需求,有哪些FRC类型?这里需要批量提取一批文件的帧率及分辨率. 1.帧率查看工具 遇到视频,很难不想到ffm ...

  6. 【python学习笔记——工具视频帧率计算器】

    视频帧率计算器,可以计算视频的帧率.帧数.时间长度, 还可以播放视频,计算视频清晰度,计算最清晰帧,保存最清晰帧. 其中计算视频清晰度的方法有三种,分别是Laplacian算子.Sobel算子和平均梯 ...

  7. ffmpeg+x264编码mp4格式的视频出现视频帧率很大,导致视频无法播放的问题

    最新用ffmpeg+x264编码视频,之前使用老版本的ffmpeg编码视频文件没有问题,但是换了最新的版本之后(ffmpeg版本号2.8.2),出现了编码出来的视频帧率特别大的问题. 找了很久,终于解 ...

  8. opencv-python:读取视频,不改变视频分辨率修改视频帧率

    文章目录 1 代码 1 代码 modify_video_frame_rate.py import os import cv2# 修改视频帧率为指定帧率,分辨率保持不变 def modify_video ...

  9. 视频帧率和分辨率对QoE的影响

    Thomas Zinner等人在<Impact of Frame Rate and Resolution on Objective QoE Metrics>(QoMEX 2010)论文中, ...

最新文章

  1. Ubuntu伪分布式hadoop安装
  2. 如何优雅的分析 Redis 里存了啥?
  3. 【复现】CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034)
  4. DOM树-Render树-RenderLayer树 对应关系
  5. Java多线程(十)之ReentrantReadWriteLock深入分析
  6. 逆向-攻防世界-reverse-box
  7. 关于onload的事件权柄以及踩过的坑
  8. Catkin工作空间 (重点)
  9. 洛谷P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
  10. oracle 的用户是什么,User 用户 还是 Role 角色 - Oracle 的 Public 是什么?
  11. matlab创建一个简易的MP3播放器GUI程序
  12. 安卓自动滑屏脚本_【按键精灵】开发抖音全自动养号脚本!可实现自动滑屏
  13. 吃易消化吸收的东西利于长寿
  14. docker compose入门
  15. 乾颐堂现任明教教主(2014年课程)TCPIP协议详解卷一 第六节课笔记
  16. JAVA 中的this 是什么意思?
  17. 使用浏览器访问或调试微信公众号(跳过微信认证)
  18. Photoshop创意设计手法14点(转)
  19. rust写操作系统 rCore tutorial 学习笔记:实验指导零 创建项目与启动
  20. 计算机word画铁路,在word中画铁路线.docx

热门文章

  1. 功能测试怎么做?2020常用功能测试方法【总结】
  2. 换脸已不算事儿 能换整个身体的AI伪造技术马上就来了!
  3. playcover 运行金铲铲没有声音的解决方案
  4. 商界达人 名片识别API
  5. 动态获取iphone键盘的高度
  6. 产品类别二级分类_医疗器械分类目录动态调整工作程序征求意见
  7. 面向对象三大特征:封装,继承,多态
  8. pandas数据分析航空公司数据
  9. android oncreate添加代码出错',android – requestFeature()必须在super.onCreate添加内容错误之前调用...
  10. android activity 重复onCreate问题