V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1054850490
V2EX  ›  FFmpeg

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

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


    mac m1 一下子就跑完了,是不是你发的视频不是跑得慢的样本
    1423
        2
    1423  
       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 个以上。 一次都没发现你说的这种“缺帧”的情况。
    1423
        5
    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
        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# 可以在不重编码的情况下,进行封装?
    ruanimal
        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   ·   实用小工具   ·   3927 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.