惨案现场
作为一名视频自媒体博主,我辛苦一天,用手机拍摄一些视频素材,晚上一到家,急忙把视频素材导入到剪辑软件后,惨案发生了,音画不同步。这可怎么办?难道是剪辑软件出 bug 了?急忙又切换了多款剪辑软件后,问题依然存在。这可怎么办?难道是视频出现了问题?用播放器播放一下视频看看,嘿,视频又一切正常了。这到底是怎么回事呢?花费了 2 个小时,翻来覆去地去尝试各种方法,问题始终没有解决。
凡事都要知道问题所在,才能对症下药。“视频本身没有问题,只要导入编辑软件就会出现音画不同步”,google 了一下, 原来真相只有一个:视频是可变帧率,简称VFR,也称动态帧率。
什么是动态帧率
视频的动态帧率指的是,视频播放时,每秒显示的帧数是不固定的,而是随着视频内容的变化而变化。在视频中,每一帧都由一张静止的图像组成,播放时快速连续地显示这些图像,就能够呈现出流畅的视频画面。
动态帧率是由视频编码器在编码视频时自动计算得出的,其目的是为了在保证视频质量的前提下,尽可能减小视频文件的大小。当视频中的场景变化不频繁时,编码器会自动降低帧率,减少视频文件的大小,反之则会提高帧率,以保证视频画面的流畅性和清晰度。
动态帧率的应用场景比较广泛。例如,在实时视频会议中,为了保证网络稳定性和视频质量,视频流会根据网络状况的变化进行帧率的自适应调整。此外,在移动设备上观看视频时,为了节省流量和电池寿命,视频播放器也会根据设备性能和网络状况自动调整帧率。另外,动态帧率还可以用于优化游戏性能,根据游戏画面的复杂度和设备性能自动调整帧率,以提高游戏的流畅度和稳定性。
总之,动态帧率是一种自适应性的视频帧率调整技术,可以根据场景的变化进行自动调整,以提高视频质量和节省资源。
如何解决
问题的根源找到,那如何解决呢?其实只需要把视频转一下码就可以了。记得,在转码的时候,一定要指定帧率为恒定帧率就可以了。来,上我们万能转码神器 ---- 大菠萝
如何检测
为了避免下次再遇到这类惨案,如果能提前知道视频是动态帧率就好了。来,试试 mediainfo 来检测视频。
从上图标出来的部分,可以清楚地看出该视频是动态帧率视频。后面再剪辑视频前,一定要先查看一下视频是否是动态帧率。
深挖背后的原因
作为一名爱专研的技术男,做到视频能检测这一步就算完结了吗?不,我还想了解更多关于 VFR 的信息。于是乎,我又详细研究了一下 FFmpeg 中 vfrdet 这个 filter, 发现它不仅可以用来检测视频是动态帧率还是固定帧率,还可以用来分析动态帧率帧率变化的剧烈程度。
1. 固定帧率视频
对于固定帧率视频,使用如下方法检测
ffmpeg -i input_1.mp4 -vf vfrdet -f null -
输出如下:
其中:
- VFR: 0.000000 :动态帧占视频帧的比值
- (0/299): 0 表示动态帧的个数, 299 表示固定帧的个数
可以看出,对应固定帧率的视频,输出的 VRF 几乎为零(注意,这里不是等于 0, 因为,在很多视频,起始帧和终止帧的时间间隔会发生变化,导致这里统计出来的数据不为 0)
2. 动态帧率视频
对于动态帧率视频,使用如下方法检测
ffmpeg -i input_2.mp4 -vf vfrdet -f null -
输出如下:
其中:
- VFR: 0.629476 :动态帧占视频帧的比值
- (1670/983): 1670 表示动态帧个数, 983 表示固定帧个数
- min: 10 动态帧的最小偏差为 10 timebase
- max: 31 动态帧的最大偏差为 31 timebase
- avg: 24 动态帧的平均偏差为 24 timebase
上面输出的值,是如何计算出来的呢?查看 FFmpeg 源码
原来是一帧一帧统计出来的呀。
至此,惨案最终告破,所有涉案人员都一一抓获,终于可以安稳地睡上一觉了。
本文暂时没有评论,来添加一个吧(●'◡'●)