我目前使用以下命令查缺帧
```
ffmpeg -v 16 -stats -hwaccel cuda -i 1.mkv -map v -fps_mode cfr -stats_period "0.05" -f null -
```
我来讲一下原理,其他不重要,主要是`-fps_mode cfr`,这个命令可以在遇到时间戳对不上的情况下补帧,虽然是补帧,但是这个补并不是我们想象中的那个补运动帧,而是将当前的帧当做下一帧继续播放。
我们先来看看官方文档的描述
我来举例,当一部视频帧数为 30 帧的时候,当你设定了 60 帧输出的时候,是不是每一秒都缺了一半?这时候这个命令就会自动的把不够的帧自动补上,但是这补帧,更像是隔行扫描的视频转到逐行扫描上播放使用的"去隔行处理"。
另一种案例就是我的案例了,大家经常下载文件的时候都遇到过不完整的情况吧?比如臭名昭著的"百度云盘",下载没带校检,如果是视频还好,因为视频缺了中间部分并不影响播放,如果是文件直接就宣告整个文件的死刑了,压缩包更不用说了,所以我的问题就是下载视频的过程中,由于网络波动的影响经常导致文件不完整,而我就是想要找出到底哪个视频文件不完整。
视频的元数据里,开头就描述了该视频该采用多少帧率播放,列如一部视频自己元数据描述了帧数是 30F ,但是视频的中间数据丢失了,就会导致下图中的后果
绿色竖线左右空白的地方就是"缺帧"的部分,当使用以上命令进行补帧的时候,就会出现“dup”参数,dup 后面的数字参数就是指补了多少帧
图中可以看到这个视频缺了 853 帧,借助这个方法,间接的观察视频的完整性,这个方法也适用于 115 以及百度云下载的视频文件不完整的筛选
但是这个方法缺点就是,太慢了,太太太慢了!!!!我本机配置是 12490f+1660ti ,但是我显卡的编码器还没我的 CPU 快,以下是我的测速
speed 就是速度,越高越好,可以看到 GPU 明显不如 CPU ,这又是为什么呢,我用 potplayer 硬解 1660ti 8K 片源很轻松,但是 12490f 解码 8K 有点吃力了,我又看到官方文档的一篇解释
感觉是我有某些地方没设置好导致的差异,因为我用 ffmpeg 硬解的时候发现只占用了 50%-60%左右,根本没吃满。
以上所述完了,我的需求就是让这个过程,更加的“省时间”,毕竟这个间接观察大法还是太耗算力,如果能稍微优化一下也好,我现在检索 2T 的视频的时候,通常都需要 5 天左右的时间才检索完,这速度实在是太慢了,我在想,就是能不能降低解码的质量换取速度,毕竟我也看不着这个画面,不知道能不能降低他的解码算力需求让我速度提升
下面提供一个损坏的视频样片,供你尝试
https://drive.google.com/file/d/1TDbxYD0vri0D8aIJ6a1OSY2abE9tc6Lk/view?usp=share_link
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/919129
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.