ffmpeg 如何更快速的查询视频的"缺帧" - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1054850490
V2EX    FFmpeg

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

  •  
  •   1054850490 2023-02-25 15:32:56 +08:00 3502 次点击
    这是一个创建于 964 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我目前使用以下命令查缺帧
    ```
    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
    13 条回复    2023-02-27 02:56:56 +08:00
    slowman
        1
    slowman  
       2023-02-25 17:03:29 +08:00


    mac m1 一下子就跑完了,是不是你发的视频不是跑得慢的样本
    slowman
        2
    slowman  
       2023-02-25 17:07:40 +08:00
    以前也遇到过视频损坏的情况,要么是 BT 没下完却以为下完了;要么是磁盘复制后放了很久,都快记不得了。打开播放才发现有成段的损坏
    Kagari
        3
    Kagari  
       2023-02-25 17:07:54 +08:00
    是个挺通用的方法,可能查 md5 会快一点
    paradoxs
        4
    paradoxs  
       2023-02-25 17:10:55 +08:00
    比如臭名昭著的"百度云盘",下载没带校检,如果是视频还好,因为视频缺了中间部分并不影响播放,如果是文件直接就宣告整个文件的死刑了,压缩包更不用说了,所以我的问题就是下载视频的过程中,由于网络波动的影响经常导致文件不完整,而我就是想要找出到底哪个视频文件不完整。
    ---------------------
    下载的时候自带完整性校验吧, 你说的这种情况 微乎其微。 我经常用百度云盘下载文件,每年下载的数量超过 3000 个以上。 一次都没发现你说的这种“缺帧”的情况。
    slowman
        5
    slowman  
       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
        6
    Shadowgraph  
       2023-02-25 23:16:19 +08:00 via Android
    ffmpeg -i a.mp4 -f null 执行完看有没有警告报错,吃 cpu
    能改硬解可能会慢点但负载低省电
    1054850490
        7
    1054850490  
    OP
       2023-02-26 01:23:43 +08:00
    @1423 #1 这个视频样本是 1080 的 avc ,而且才 2 分钟不到,如果是我电脑跑的话也可以达到 110x 的速度迅速跑完,但是我需要面对的场景很多很杂,因为都是从 youtube 扒下来的,大多都是 vp9 的 4K 以及 av1 8k ,面对 av1 的时候,我解码速度刚好 1X ,刚刚好和视频播放速率持平,但是我扒的视频非常的多,几千个,面对海量数据时间跨度就非常大
    1054850490
        8
    1054850490  
    OP
       2023-02-26 01:25:16 +08:00
    @paradoxs 4# 如果你是下载视频,视频损坏了你也察觉不了,因为你根本不知道哪一部分损坏了,我就经常用百度云下载压缩包,经常遇到压缩包解压不了的情况,所以可以确定百度云下载是不带校检的
    1054850490
        9
    1054850490  
    OP
       2023-02-26 01:26:58 +08:00
    @1423 5# 上传校检是每个网盘都做的事,我说的是下载没有校检,如果你经常下载压缩包你就理解了,我经常在 3dm 下载盗版游戏,都是压缩包的,用百度云下载的时候经常遇到有几个哈希对不上的,得我重新下,由此可见百度云是没有校检的,截止目前都没有
    flush9f
        10
    flush9f  
       2023-02-26 01:41:11 +08:00
    缺帧一般是数据损坏了,就算 I 帧 P 帧能读出来,也不见得能解码出来。如果用 ff 的话,我觉得直接格式重打包就能发现错误,根本没必要解码。
    1054850490
        11
    1054850490  
    OP
       2023-02-26 04:49:51 +08:00
    @flush9f 10# 可以在不重编码的情况下,进行封装?
        12
    ruanimal  
       2023-02-26 15:41:51 +08:00
    常年用百度,没碰到过这种情况。。
    ysc3839
        13
    ysc3839  
       2023-02-27 02:56:56 +08:00 via Android
    用 gstreamer 只解封装看看能否检测出错误吧,能的话就好办,不能的话估计还是绕不开解码
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3202 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:29 PVG 19:29 LAX 04:29 JFK 07:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86