如何从脚本验证视频文件?

时间:2009-05-21 20:14:51

标签: linux validation video

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

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

5 个答案:

答案 0 :(得分:6)

听起来你想做的是:

mplayer -vo null -ao null input.file

然后解析输出并返回值以查看它是否可以实际播放&amp;解码流。这将花费一些时间(但比实时更快)。如果你想要更快的东西,这里有一些更多的建议:

一件容易的事就是做一个

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/

答案 1 :(得分:2)

如果您使用的是MP4文件,可能需要查看 mpeg4ip 项目,特别是 mp4videoinfo mp4info等工具即可。这可能足以满足您的需求,并且非常快。

从头版:

  • 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$

答案 2 :(得分:2)

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

视频文件非常强大 - 作为一项实验,我拍摄了一个随机的MPEG-4视频文件,在十六进制编辑器中打开它并开始更改字节.. mplayer并且Quicktime仍然无错误地播放。< / p>

在从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的脚本并检查输出是否有错误消息/警告并不困难,但除非更改的字节在文件头中或大量数据中改变了,你永远都找不到它们

答案 3 :(得分:1)

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

答案 4 :(得分:-1)

我建议你使用sha1sum,一个你可能已经拥有的命令行工具(如果没有,你可能也有md5sum,这对于这个工作没问题)...你需要做的就是比较stdout恢复之前和之后的sha1sum ......