ffmpeg 如何更快速的查询视频的"缺帧"

2023-02-25 15:32:56 +08:00
 1054850490
我目前使用以下命令查缺帧
```
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
2156 次点击
所在节点    FFmpeg
13 条回复
1423
2023-02-25 17:03:29 +08:00


mac m1 一下子就跑完了,是不是你发的视频不是跑得慢的样本
1423
2023-02-25 17:07:40 +08:00
以前也遇到过视频损坏的情况,要么是 BT 没下完却以为下完了;要么是磁盘复制后放了很久,都快记不得了。打开播放才发现有成段的损坏
Kagari
2023-02-25 17:07:54 +08:00
是个挺通用的方法,可能查 md5 会快一点
paradoxs
2023-02-25 17:10:55 +08:00
比如臭名昭著的"百度云盘",下载没带校检,如果是视频还好,因为视频缺了中间部分并不影响播放,如果是文件直接就宣告整个文件的死刑了,压缩包更不用说了,所以我的问题就是下载视频的过程中,由于网络波动的影响经常导致文件不完整,而我就是想要找出到底哪个视频文件不完整。
---------------------
下载的时候自带完整性校验吧, 你说的这种情况 微乎其微。 我经常用百度云盘下载文件,每年下载的数量超过 3000 个以上。 一次都没发现你说的这种“缺帧”的情况。
1423
2023-02-25 17:23:06 +08:00
不过百度其实是有提供校验的,百度秒传就是这个原理
你可以在本地计算秒传代码,再跟百度网页端获取的 diff 下,就能知道是否一致了
https://github.com/wen-long/bdpass

如下是我在本地运行的例子,你可以直接百度秒传保存到自己的网盘,这样同样能证实这些文件早有人上传到百度网盘,而且我本地的文件没有损坏
bdpass .
49F8C792FE4E37B296DAE1798D1F3A0B#41073A054E8AC9506C481B2C29495211#00145073633#[Mabors&VCB-Studio] Shigatsu wa Kimi no Uso [Hi10p_1080p]/CDs/[141119] 四月は君の嘘 僕と君との音楽帳 [24bit_96kHz] (flac+jpg)/01. ベートーベン:ピアノ・ソナタ第 14 番 _月光_ 第 3 楽章.flac
D685FC9E80483E32ED4751ECC14AF9B3#4B031F13EC86DBA40F04B4CA33CB9566#00238970570#[Mabors&VCB-Studio] Shigatsu wa Kimi no Uso [Hi10p_1080p]/CDs/[141119] 四月は君の嘘 僕と君との音楽帳 [24bit_96kHz] (flac+jpg)/02. ベートーベン:ヴァイオリン・ソナタ第 9 番 _クロイツェル_ 第 1 楽章.flac
Shadowgraph
2023-02-25 23:16:19 +08:00
ffmpeg -i a.mp4 -f null 执行完看有没有警告报错,吃 cpu
能改硬解可能会慢点但负载低省电
1054850490
2023-02-26 01:23:43 +08:00
@1423 #1 这个视频样本是 1080 的 avc ,而且才 2 分钟不到,如果是我电脑跑的话也可以达到 110x 的速度迅速跑完,但是我需要面对的场景很多很杂,因为都是从 youtube 扒下来的,大多都是 vp9 的 4K 以及 av1 8k ,面对 av1 的时候,我解码速度刚好 1X ,刚刚好和视频播放速率持平,但是我扒的视频非常的多,几千个,面对海量数据时间跨度就非常大
1054850490
2023-02-26 01:25:16 +08:00
@paradoxs 4# 如果你是下载视频,视频损坏了你也察觉不了,因为你根本不知道哪一部分损坏了,我就经常用百度云下载压缩包,经常遇到压缩包解压不了的情况,所以可以确定百度云下载是不带校检的
1054850490
2023-02-26 01:26:58 +08:00
@1423 5# 上传校检是每个网盘都做的事,我说的是下载没有校检,如果你经常下载压缩包你就理解了,我经常在 3dm 下载盗版游戏,都是压缩包的,用百度云下载的时候经常遇到有几个哈希对不上的,得我重新下,由此可见百度云是没有校检的,截止目前都没有
flush9f
2023-02-26 01:41:11 +08:00
缺帧一般是数据损坏了,就算 I 帧 P 帧能读出来,也不见得能解码出来。如果用 ff 的话,我觉得直接格式重打包就能发现错误,根本没必要解码。
1054850490
2023-02-26 04:49:51 +08:00
@flush9f 10# 可以在不重编码的情况下,进行封装?
ruanimal
2023-02-26 15:41:51 +08:00
常年用百度,没碰到过这种情况。。
ysc3839
2023-02-27 02:56:56 +08:00
用 gstreamer 只解封装看看能否检测出错误吧,能的话就好办,不能的话估计还是绕不开解码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/919129

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX