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

Linux 如何从脚本验证视频文件?,linux,validation,video,Linux,Validation,Video,我有一个有很多视频文件的服务器。恢复后,我注意到几个文件的校验和发生了变化。因为我没有所有文件的校验和,所以我想写一个脚本来验证文件的完整性。它对于存档(tart,unzip-t,rar t等)或图像(convert image.jpg/tmp/test.png)非常简单 我需要将哪些选项传递到mplayer或vlc或Linux上的任何其他视频工具以实现相同的效果(即,验证文件内容而不必观看整个视频)?因为mplayer提供了一些选项,如果mencoder无法解码输入文件(我还没有测试过),那么

我有一个有很多视频文件的服务器。恢复后,我注意到几个文件的校验和发生了变化。因为我没有所有文件的校验和,所以我想写一个脚本来验证文件的完整性。它对于存档(
tart
unzip-t
rar t
等)或图像(
convert image.jpg/tmp/test.png
)非常简单


我需要将哪些选项传递到
mplayer
vlc
或Linux上的任何其他视频工具以实现相同的效果(即,验证文件内容而不必观看整个视频)?

因为mplayer提供了一些选项,如果mencoder无法解码输入文件(我还没有测试过),那么这些选项对于此类测试来说可能足够好了。这将类似于您提到的图像测试(convert image.jpg/tmp/test.png)

我建议您使用sha1sum,这是一个您可能已经拥有的命令行工具(如果没有,您可能还拥有md5sum,这对这项工作来说很好)。。。您需要做的只是比较恢复前后的sha1sum标准输出…

听起来您想要做的是:

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()以执行类似的任务。matroska工具也适用于这种情况。()

如果您正在使用MP4文件,您可能需要查看项目,特别是mp4videoinfomp4info等工具。这可能足以满足您的需求,而且速度非常快

首页:

  • mp4dump以文本形式转储MP4文件元信息的实用程序
  • mp4trackdump以文本形式转储MP4文件曲目信息的实用程序
  • mp4info用于显示MP4文件摘要的实用程序
  • mp4videoinfo实用程序,用于转储有关MP4文件视频曲目的信息
  • avidump用于显示AVI文件摘要的实用程序
  • yuvdump在屏幕上显示原始视频文件的实用程序
  • mpeg\u ps\u info实用程序,用于在mpeg节目流或vob文件中显示流
  • mpeg\u ps\u 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$

除了看所有的视频,没有“完美”的方法来做到这一点

视频文件非常健壮——作为一个实验,我随机选取了一个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
,并检查输出是否有错误消息/警告并不困难,但除非更改的字节位于文件头中,或者大量数据已更改,否则您将永远找不到所有这些脚本。但这并不能告诉我文件是否已经损坏。@Aaron Digulla我在上面提供的链接中提到了“mencoder-ovc-lavc-oac-lavc-o”。但不确定这是否适用于您的输入文件。您可能需要进行实验。如果没有相同的校验和,视频是否已损坏(无法播放)?只是好奇你为什么需要它,这样我才能知道。你怎么怀疑这些文件被破坏了?找出这些问题的“根本原因”也许花时间会更好。有关验证文件的更多建议,请参见下面的答案。@johnny:我将服务器备份到硬盘上。似乎其中一个备份硬盘有故障。当我从备份中还原文件时,文件校验和发生了更改。我不知道为什么会发生这种情况,但我想可能会发生1 TB数据中的一个小错误。我的问题是我没有所有文件的校验和。因此,我也需要一种方法来验证这些文件。您可能需要在mplayer命令行中添加-benchmark,以使其比实时速度更快。