为什么视频会缺帧?细究格式工厂快速剪辑的bug 您所在的位置:网站首页 导入gif进pr掉帧 为什么视频会缺帧?细究格式工厂快速剪辑的bug

为什么视频会缺帧?细究格式工厂快速剪辑的bug

2023-08-12 06:39| 来源: 网络整理| 查看: 265

大家好,我是墨滢。

今天在和vtuber群的小伙伴讨论剪辑的时候,无意间发现了一个bug,这个bug说大不大说小不小,在这里简单分享一下。

先说结论

相信vtuber圈的朋友或多或少都看过一些“海盗视频”(指粉丝自己制作的剪辑视频,无贬义),而这类视频很重要的一点就是时效性,往往前脚直播结束,后脚就投稿了视频。这种情况下,一般只需要对视频剪一刀就行了,不会用复杂的工具(如PR)来剪辑。而诸多剪辑方法中,最简单的就是格式工厂。

在格式工厂中,有两种剪辑方法。第一种,就是在导出mp4功能中选择剪辑片段,而第二种,则是使用快速剪辑功能。

这里还是先说结论吧:快速剪辑导出的视频有的时候开头会卡住不动几秒,解决方法就是,用导出mp4功能对视频进行重新压制,而不要使用快速剪辑。

(当然文章末尾还介绍了一种更加好用的方法,能够兼顾速度且不出bug。)

为什么会这样呢?

【这里非常感谢另外一篇文章(CV3525702,作者 千里夜雨)所提供的资料,里面提到了这个现象和部分原因,本文也引用了一些片段】

快速剪辑有一个很严重的bug,就是有的时候导出的视频会有缺帧的情况,具体体现就是——前几秒的画面是静止不动的。并且就算导出以后再用快速剪辑做剪辑,缺帧仍然存在。

究竟是什么造成了缺帧呢?

这个问题其实和视频关键帧有关。所以首先我们要了解,什么是视频关键帧。

视频在电脑里储存的时候,并不是把每一张画面都存储下来的(avi格式除外,因为avi格式是无压缩的),而是只储存关键帧的画面。关键帧与关键字之间的空隙,只记录相对上一帧的变化。

视频关键帧的概念

当然,实际情况会比我说的要更复杂一些,这里为了方便大家理解,采用的是比较简单的说法。

相信大家这个时候一定会想到一个问题:如果我剪辑的地方恰好在非关键帧上,视频会怎么样呢?答案其实很简单:就是从这里到下一个关键帧的片段,是完全静止不动的。

为什么会静止不动呢,我们可以打个比方:小明从家出发,向南走了50公里。这里,“家”就是关键帧,而“向南50公里”就是其他帧。大家可以看到,其他帧实际上只存储了相对的数据,如果我们把“家”这个参照物丢掉,光靠“向南50公里”,你是无法定位小明在哪的。

这就解释了为什么关键帧被我们砍掉以后,画面会卡住,因为电脑压根不知道画面是什么样的。

那么第二个问题就来了:那为什么导出为mp4功能就不会出现这个问题,偏偏快速剪辑会出问题呢?

这就和快速剪辑功能的实现原理有关了。

(注意,以下内容是通过测试结果得出的合理推断,并不保证100%正确)

快速剪辑时究竟发生了什么?

在尝试解决这个问题的时候,我们发现了另外一个非常奇怪的现象:快速剪辑的导出速度有些快的离谱了。同样的视频,同样的剪辑片段,导出mp4花了40多秒,而快速剪辑几乎在一瞬间就导出了。

这个现象和平时的经验是不符合的,因为视频压制是非常耗费时间的,一个稍微长一点的视频压个半个小时都是有可能的。所以我们可以肯定的是:花了很长时间的导出mp4功能应该就是我们熟知的视频压制,而快速剪辑功能使用的是其他的方法。

接下来我又发现了第二条线索——快速剪辑界面里是不可以修改视频编码的,而导出mp4界面里则可以。这是否意味着快速剪辑根本没有对视频进行重新编码?

于是,基于以上两条线索,我们可以提出一个猜想:快速剪辑仅仅是对文件字节流的剪切,而非对视频进行编码压制。即:快速剪辑很有可能是计算开始和结束时间所对应的文件字节位置,然后直接简单粗暴的把其他二进制数据丢弃,再给需要的视频数据包装上文件头,就直接“剪辑”了视频。

如果猜想是正确的,那么上面的现象就很容易解释了——因为只需要计算二进制数据的开始和结束位置,剩下的只需要拷贝数据就行了,所以才会导出的那么快;因为压根就没有对视频进行编码,所以自然不能修改文件配置,只能以原先的配置导出;因为仅仅是对二进制数据的剪切,自然会把关键帧拦腰斩断,导致开头的片段成了无源之水,只会显示卡住的画面。

而导出mp4功能自然不会有这个问题,因为它就是实打实的视频重编码(压制),当然可以通过算法计算出新的关键帧的位置,视频开头也不会卡住。

更好的解决方法

至此,这个bug的解决方案也就很显然了:使用导出mp4功能,而不是快速剪辑功能来剪视频。照理来说,这篇文章也就可以结束了。但是,这种解决方法存在一个致命的缺点:导出mp4花费的时间太长了!

但是,和常人想象中不同,视频剪裁需要的时间和剪裁出的时长无关,和视频的总长度有关。即便是从大视频中截取末尾的一小段内容,剪辑时间相比正常情况都会成倍扩张。

作者:千里夜雨https://www.bilibili.com/read/cv3525702

快速剪辑面对的,通常是非常长的直播视频,往往能够达到一个小时以上,此时使用mp4导出会压制很久。但是如果使用快速剪辑,又会导致缺帧。如何兼顾快速剪辑的速度,又能不缺帧呢?解决方案如下:

用快速剪辑剪出视频所在片段,但是在片段前预留5秒以上的空隙。然后导出,此时几乎瞬间就能完成。

再用导出mp4功能,导入步骤1得到的视频。接着,把开头几秒的卡顿剪掉,再导出。此时因为视频已经比较短了,所以导出的速度是可以接受的。

这样,问题就完美解决了,我们既兼顾了快速剪辑功能的速度,又能解决它所带来的bug。

当然,这里千里夜雨大佬还做出了一个提醒:

记住,在从原视频(flv格式)截取段落时,为了保证视频质量不下降,各类设置勾选的一般是copy,但处理片头缺帧的段落时,对于已经缺帧的文件进行剪裁,一定不要在视频编码中选择copy(或者copy stream)。否则这次截取依旧会缺帧。

至此,这个奇妙的bug总算是完美的解决了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有