【问题标题】:How can I validate a video file from a script?如何验证脚本中的视频文件?
【发布时间】:2009-05-21 20:14:51
【问题描述】:

我有一个包含大量视频文件的服务器。还原后,我注意到几个文件的校验和发生了变化。由于我没有所有文件的校验和,我想编写一个脚本来验证文件的完整性。存档(tar tunzip -trar t 等)或图像(convert image.jpg /tmp/test.png)很简单。

我需要将哪些选项传递给mplayervlc 或Linux 上的任何其他视频工具才能达到相同的效果(即无需观看整个视频即可验证文件内容)?

【问题讨论】:

  • 如果没有相同的校验和,视频是否损坏(无法播放)?只是好奇你为什么需要它,所以我可以学习。
  • 您如何怀疑文件已损坏?寻找此类问题的“根本原因”可能是更好的选择。有关验证文件的更多建议,请参阅下面的答案。
  • @johnny:我在硬盘上备份我的服务器。似乎其中一个备份硬盘出现故障。当我从备份中恢复它时,文件校验和发生了变化。我不确定它为什么会发生,但我猜 1 TB 数据中的一点错误是可能发生的。
  • 我的问题是我没有所有文件的校验和。所以我也需要一种方法来验证这些文件。

标签: linux validation video


【解决方案1】:

听起来你想做的是:

mplayer -vo null -ao null input.file

然后解析输出和返回值,看看它是否可以真正播放和解码流。这将需要一些时间(但比实时更快)。如果您想要更快的速度,这里有更多建议:

一件容易的事是做一个

mplayer -identify -vo null -ao null

文件,然后解析输出并查看返回值是否合理。

关于校验和不正确,很难知道这是否是您的媒体播放器(mplayer、vlc、totem 等)的问题。一个好的媒体播放器可以容忍许多位或字节级别的错误,而对最终播放的影响很小。当一个非常严格的媒体播放器看到格式错误或不正确的编解码器和包装器字节时,它将退出。

要验证包装器(容器)字节,您可以执行类似

的操作
mencoder -ovc copy -oac copy input.file -o output.file

问题是 mencoder 会想要创建一个 .avi 文件用于输出。如果您的输入是 .avi,那么这将非常有用。

您可以运行类似的 ffmpeg 命令行,如下所示:

ffmpeg -acodec copy -vcodec copy input.file output.file

如果文件是 .mp4 文件,您可能需要查看 mp4box (http://www.videohelp.com/tools/mp4box) 以执行类似的任务。 matroska 工具也适用于这类事情。 (http://www.matroska.org/)

【讨论】:

  • 您可能需要在 mplayer 命令行中添加 -benchmark 以使其比实时运行更快。
【解决方案2】:

如果您正在处理 MP4 文件,您可能需要查看 mpeg4ip 项目,特别是像 mp4videoinfomp4info 这样的工具强>。这可能足以满足您的需求,而且速度非常快。

来自首页:

  • mp4dump 以文本形式转储 MP4 文件元信息的实用程序
  • mp4trackdump 以文本形式转储 MP4 文件轨道信息的实用程序
  • mp4info 显示 MP4 文件摘要的实用程序
  • mp4videoinfo 转储 MP4 文件视频轨道信息的实用程序
  • avidump 显示 AVI 文件摘要的实用程序
  • yuvdump 在屏幕上显示原始视频文件的实用程序
  • mpeg_ps_info 用于在 mpeg 程序流或 vob 文件中显示流的实用程序
  • mpeg_ps_extract 用于在 mpeg 程序流或 vob 文件中提取基本流的实用程序

这是我的诺基亚 N95 上的 MP4 输出示例:

manoa:Movies stu$ mp4info 20081017001.mp4 
mp4info version 1.5.0.1
20081017001.mp4:
Track   Type    Info
1   video   MPEG-4 Unknown Profile(4), 3.620 secs, 2700 kbps, 640x480 @ 23.480663 fps
2   audio   MPEG-4 AAC LC, 3.797 secs, 97 kbps, 48000 Hz
manoa:Movies stu$ 
manoa:Movies stu$ 
manoa:Movies stu$ mp4videoinfo 20081017001.mp4
mp4videoinfo version 1.5.0.1
tracks 1
mp4file 20081017001.mp4, track 1, samples 85, timescale 30000
sampleId      1, size 24110 time 0(0) VOP-I
sampleId      2, size  9306 time 4076(135) VOP-P
sampleId      3, size 13071 time 5104(170) VOP-P
... (a bunch more frames and a bit of info)  ...
sampleId     59, size  8702 time 64975(2165) VOP-P
sampleId     60, size  8826 time 65980(2199) VOP-P
sampleId     61, size  9819 time 66966(2232) GOV VOP-I
sampleId     62, size  5591 time 67986(2266) VOP-P
... (a bunch more frames and a bit of info)  ...
sampleId     83, size 10188 time 105546(3518) VOP-P
sampleId     84, size  6533 time 106585(3552) VOP-P
sampleId     85, size  6032 time 107601(3586) VOP-P
manoa:Movies stu$

【讨论】:

    【解决方案3】:

    没有观看所有视频,没有“完美”的方式来做到这一点。

    视频文件非常强大 - 作为一个实验,我随机选取了一个 MPEG-4 视频文件,在十六进制编辑器中打开它并开始更改字节。mplayer 并且 Quicktime 仍然可以毫无错误地播放它。

    在收到 mplayer 的任何错误之前,我必须删除数千个字节:

    ...
    [mpeg4 @ 0x6762b0]marker does not match f_code
    [mpeg4 @ 0x6762b0]marker does not match f_code
    [mpeg4 @ 0x6762b0]concealing 852 DC, 852 AC, 852 MV errors
    [mpeg4 @ 0x6762b0]header damaged:  0.055  16/ 16 15%  1%  3.5% 0 0 
    Error while decoding frame!
    

    编写一个在每个视频上运行mplayer 并检查输出是否有错误消息/警告的脚本并不难,但除非更改的字节在文件头中,或者更改了很多数据,你永远找不到他们所有的

    【讨论】:

      【解决方案4】:

      由于 mplayer 有 convert from one video format to another 的选项,假设 mencoder 在无法解码输入文件时返回错误(我没有测试过),这对于这样的测试可能已经足够好了。这将类似于您提到的 图像测试 (convert image.jpg /tmp/test.png)

      【讨论】:

      • @Aaron Digulla 我上面提供的链接提到“mencoder -ovc lavc -oac lavc -o ”。不过,不确定这是否适用于您的输入文件。您可能需要进行实验。
      【解决方案5】:

      我建议你使用 sha1sum,一个你可能已经拥有的命令行工具(如果没有,你可能也有 md5sum,这对这份工作来说很好)......你需要做的就是比较标准输出还原前后的sha1sum...

      【讨论】:

      • 我现在就这样做。但这并不能告诉我文件是否已经损坏。
      猜你喜欢
      • 2014-04-18
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2021-01-03
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多