如何从脚本validationvideo文件?

我有一个有很多video文件的服务器。 恢复后,我注意到一些文件的校验和改变了。 由于我没有所有文件的校验和,我想编写一个脚本来validation文件的完整性。 档案( tar tunzip -trar t等)或图像( convert image.jpg /tmp/test.png )很简单。

我需要将哪些选项传递给mplayervlc或Linux上的任何其他video工具来达到相同的效果(即validation文件内容而不必观看整个video)?

这听起来像你想要做的是:

 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/

如果您正在使用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$ 

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

视频文件是相当强大的 – 作为一个实验,我采取了一个随机的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的脚本并不困难,并且检查输出是否有错误消息/警告,但是除非更改的字节在文件头中,否则大部分数据都会被更改找到他们

由于mplayer可以选择从一种视频格式转换为另一种视频格式,如果mencoder无法解码输入文件(我没有测试过),它会返回一个错误。 这将工作类似于你提到的图像测试 (convert image.jpg /tmp/test.png)

我建议你使用sha1sum,一个你可能已经拥有的命令行工具(如果没有的话,你可能也有md5sum,这对于这个工作来说很好)…你只需要比较sha1sum的stdout和恢复后…