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

这个检测视频文件是否损坏的方法的原理是什么?

  •  
  •   uechris · 2020-01-29 19:11:23 +08:00 · 5696 次点击
    这是一个创建于 1760 天前的主题,其中的信息可能已经有所发展或是发生改变。

    希望实现对音视频文件完整性的检测,查了一下,主流的方法是利用 ffmpeg.

    ffmpeg -v error -i file.avi -f null - 2>error.log

    但是这样做的 cpu 占用率很高.

    我又在这里找到了另一种方法.文章提供了一个可执行文件,它调用 ffmpeg 以检测视频完整性,没有源码.我在粗略的测试之后,发现这种方法应该是有效的.我捕捉了它对 ffmpeg 调用参数,大致如下:

    ffmpeg -i file.MOV

    ffmpeg -ss 1 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE25.temp

    ffmpeg -ss 2 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE27.temp

    ffmpeg -ss 3 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE28.temp

    ffmpeg -ss 4 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE29.temp

    ffmpeg -ss 6 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE2B.temp

    ffmpeg -ss 7 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE2C.temp

    ffmpeg -ss 8 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE2D.temp

    ffmpeg -ss 9 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE2F.temp

    ffmpeg -ss 10 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE30.temp

    ffmpeg -ss 12 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE31.temp

    ffmpeg -ss 13 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE33.temp

    ffmpeg -ss 14 -i file.MOV -y -f image2 -vframes 1 -s 1x1 tempdir/125F3585BE34.temp

    ......

    查了一下这条命令,没有找到任何相关结果.

    看起来当 ffmpeg 生成的文件为空时该程序会认为视频是损坏的.此时 ffmpeg 的输出最后会有这么一行:

    Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)

    所以想问一下:

    1,这种方法能工作吗?

    2,它工作的原理是什么?

    3,怎样将这种方法扩展到检测音频文件完整性上?

    4,还有什么检测音视频文件完整性的方法?

    6 条回复    2020-01-31 11:38:51 +08:00
    msg7086
        1
    msg7086  
       2020-01-30 00:58:01 +08:00 via Android
    这种做法检测不了所有的文件损坏。
    aliipay
        2
    aliipay  
       2020-01-30 13:14:46 +08:00
    看参数大概猜测,一个是解码每一帧,一个是每秒解码一帧
    BB9z
        3
    BB9z  
       2020-01-30 17:35:36 +08:00
    命令你都拿到了,原理还分析不出来么?

    挺有趣的,LMGTFY
    https://ffmpeg.org/ffmpeg.html#Options

    你说的「主流方法」是解码整个文件,资源需求当然高了。后一种方法是尝试解码每秒的一像素的一帧。

    能工作么?通过的话播放器应该能完整的播下来——不大段丢数据,但不能保证所有帧都 OK,可能有花屏。

    音频检测?据我所知,音频的这种解码包都是处理特定格式的,没范用的。
    uechris
        4
    uechris  
    OP
       2020-01-30 21:34:50 +08:00
    @BB9z 我看得出来这个命令是在每一到两秒解码一帧.我感到困惑的地方正好就在此处:每一到两秒解码一帧怎么能确定视频的其他部分是完好的呢?
    看了一下大家的回答,看来答案就是,后一种方法的确无法检测到所有损坏.靠谱的方法应该还是第一种.
    hardwork
        5
    hardwork  
       2020-01-31 11:31:43 +08:00 via Android
    完整性
    hardwork
        6
    hardwork  
       2020-01-31 11:38:51 +08:00 via Android
    这是检测解码是否有错来判断视频完整性,音频应该没办法,一般音频编码单元之间没有参考关系。要检测完整性,应该有原始参照,和原始比呗,或者通过原始信息获知完整性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1212 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:21 · PVG 02:21 · LAX 10:21 · JFK 13:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.