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

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

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

Ответы [ 5 ]

6 голосов
/ 22 мая 2009

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

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

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

2 голосов
/ 02 июня 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$
1 голос
/ 22 мая 2009

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

0 голосов
/ 22 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...