对于视频网站、电视厂商以及进行视频压制的用户来说,改变视频的帧率算是一个比较常见的需求。视频网站改变帧率主要是为了向不同级别的网站用户提供差异化服务;电视厂商则是以提供更好的显示效果作为电视的卖点;对视频压制有所研究的用户会为了更好的显示效果而追求更高的帧率,或者为了更高的压缩率而选择更低的帧率。
帧率的变化能分为两种:低帧率变为高帧率;高帧率变为低帧率。虽然两者出于不同的需求,但是采取的是同一实现方式。一般来说,视频中相邻的两帧之间有相同的时间间隔,例如帧率为24的视频的相邻两帧之间的间隔为1/24秒,帧率为60的视频的相邻两帧之间的间隔为1/60秒。如果要把帧率为24的视频转换为60的帧率,则需要通过位于0,1/24,2/24,…秒上的帧来构造出位于0,1/60,2/60,…秒的帧;如果要把帧率为24的视频转换为10的帧率,那么则需要构造分别位于0,1/10,2/10,…秒的帧。本质上说,提高帧率以及降低帧率同样都是构造出不存在于源视频上的帧,两者只存在构造的帧的数量上的差别。
构造不存在的帧,我们称之为插帧(Frame Interpolation),插帧有三种实现方式:
- Duplication,复制相近的帧。
- Blend,用相邻的两帧进行混合。
- Motion Interpolation,结合图像运动来构造中间帧。
下面对比了这三种不同的实现方式的插帧效果,把每秒15帧的视频插帧成每秒30帧:
每秒播放1帧可以明显看出采用不同实现方法的时不同表现
下面分析三种不同实现方式的具体实现。
Duplication
输出的时间节点上的帧,就是我们需要生成的帧,此处称之为中间帧。在生成当前的中间帧的过程中涉及到两个输入帧,分别为小于输出时间并且最接近该输出时间的输入帧(假设为第n帧),以及大于输出时间并且最接