Как я могу проверить видеофайл из сценария?

У меня есть сервер с большим количеством видеофайлов. После восстановления я заметил, что контрольная сумма пары файлов изменилась. Поскольку у меня нет контрольных сумм для всех файлов, я хотел написать скрипт для проверки целостности файлов. Это просто для архивов (tar t, unzip -t, rar t и т. д.) или изображений (convert image.jpg /tmp/test.png).

Какие параметры мне нужно передать mplayer или vlc или любому другому видеоинструменту в Linux, чтобы добиться того же эффекта (т. е. проверить содержимое файла без просмотра всего видео)?


person Aaron Digulla    schedule 21.05.2009    source источник
comment
Является ли видео поврежденным (не воспроизводится), если оно не имеет одинаковой контрольной суммы? Просто любопытно, зачем вам это нужно, чтобы я мог учиться.   -  person johnny    schedule 22.05.2009
comment
Как вы подозреваете, что файлы были повреждены? Лучше потратить время на поиск первопричины таких проблем. См. мой ответ ниже для получения дополнительных предложений по проверке файла.   -  person slacy    schedule 22.05.2009
comment
@johnny: я делаю резервную копию своего сервера на жестких дисках. Кажется, один из резервных жестких дисков вышел из строя. Контрольная сумма файла изменилась, когда я восстановил его из резервной копии. Я не уверен, почему это произошло, но я думаю, что битовая ошибка в 1 ТБ данных может произойти.   -  person Aaron Digulla    schedule 22.05.2009
comment
Моя проблема в том, что у меня нет контрольных сумм для всех файлов. Поэтому мне также нужен способ проверки этих файлов.   -  person Aaron Digulla    schedule 22.05.2009


Ответы (5)


Похоже, что вы хотите сделать это:

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/ )

person slacy    schedule 21.05.2009
comment
Возможно, вам придется добавить -benchmark в командную строку mplayer, чтобы он работал быстрее, чем в реальном времени. - person rix0rrr; 02.06.2009

Если вы работаете с файлами 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.

Вот пример вывода MP4, снятого на мою Nokia N95:

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$
person Stu Thompson    schedule 02.06.2009

Если не считать просмотра всех видео, нет «идеального» способа сделать это.

Видеофайлы довольно устойчивы - в качестве эксперимента я взял случайный видеофайл MPEG-4, открыл его в hex-редакторе и начал менять байты. 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 для каждого видео и проверяет вывод на наличие сообщений об ошибках/предупреждений, но если измененные байты не находятся в заголовке файла или не было изменено много данных, вы никогда не найди их всех

person dbr    schedule 02.06.2009

Поскольку у mplayer есть опции для преобразования из одного видеоформата в другой, этого может быть достаточно для такого теста, предполагающего mencoder возвращает ошибку, если не может декодировать входной файл (я этого не проверял). Это будет работать аналогично тесту изображения, который вы упомянули (convert image.jpg /tmp/test.png)

person lothar    schedule 21.05.2009
comment
@Aaron Digulla В приведенной выше ссылке упоминается mencoder ‹filename.avi› -ovc lavc -oac lavc -o ‹output.avi›. Однако не уверен, что это работает с вашими входными файлами. Возможно, вам придется поэкспериментировать. - person lothar; 22.05.2009

Я рекомендую вам использовать sha1sum, инструмент командной строки, который у вас, вероятно, уже есть (а если нет, у вас, вероятно, также есть md5sum, который подойдет для этой работы)... Все, что вам нужно сделать, это сравнить стандартный вывод sha1sum до и после восстановления...

person dicroce    schedule 21.05.2009
comment
Я делаю это сейчас. Но это не говорит мне, поврежден ли файл уже или нет. - person Aaron Digulla; 22.05.2009