Как проверить целостность видеофайла (avi, mpeg, mp4 ...)?

160156
Rook

Это название может вводить в заблуждение, поэтому позвольте мне объяснить ...

Я загружаю видеофайл ... MPEG, AVI - будучи одним из популярных форматов. Теперь, если я загружаю его, и загрузка прерывается в середине загрузки ... тогда, например, проигрыватель Windows Media выдаст ошибку и откажется воспроизводить ее (хотя файл, скажем, Заполнено на 98%). Но такие игроки, как KMPlayer или MediaPlayer Classic будут воспроизводить его до этого момента (фактически, они могут воспроизводить его и во время загрузки).

Итак, мне интересно ... без использования каких-либо средств загрузки (менеджеров загрузки и т. Д.) Для обеспечения полной загрузки файла, как можно проверить, был ли загружен видеофайл целиком и завершен ли он?

101
Неполный MPEG должен играть без проблем. AVI имеет индексы для быстрого поиска в конце файла, которые некоторые проигрыватели будут использовать, а некоторые не требуют или будут игнорировать. bobince 14 лет назад 0
`Неполный MPEG должен воспроизводиться без проблем. @Bobince, вопрос был / в том, как проверить наличие повреждений, а не в том, как воспроизвести неполный файл. Даже если формат поддерживает воспроизведение неполных файлов, все равно должна быть возможность проверить наличие повреждений, если файл не соответствует спецификациям формата. Например, вы все еще можете прочитать неполный текстовый файл, но вы все равно можете определить, есть ли у файла проблемы, например, заканчивается ли он в середине предложения или есть фрагмент явно пропущенной информации в середине. Synetech 10 лет назад 6

5 ответов на вопрос

108
whitequark

Вы можете использовать функцию в ffmpegвидео конвертере: если вы укажете ее, чтобы перекодировать видео в ноль, он просто прочитает входной файл и сообщит о любых появившихся ошибках. Это очень быстрый процесс, потому что видеокадры просто читаются, проверяются и незаметно сбрасываются.

Пример командной строки: (для Linux)

ffmpeg -v error -i file.avi -f null - 2>error.log 

-v errorозначает определенный уровень детализации (чтобы показать некоторые ошибки, которые обычно скрыты, потому что они не сильно влияют на играбельность).

Вы получите полный журнал ошибок с некоторой общей информацией о файле, который будет выводить ffmpeg, так что это, вероятно, потребует вашего внимания, через фильтры можно написать для выполнения пакетной проверки похожих файлов.

FFmpeg также доступен для Windows здесь . Командная строка будет почти идентична за исключением перенаправления stderr:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1 
Та же скорость, что и при конвертации. Somebody 11 лет назад 5
Другим вариантом является `ffprobe`, который поставляется вместе с` ffmpeg`. Он не выполняет никакого преобразования, а просто считывает метаданные из файла. Поэтому он обнаружит ошибки в метаданных, но не обнаружит никаких проблем в самом файле. Лично используя `ffprobe` для быстрой проверки загруженного перед дальнейшей обработкой mente 11 лет назад 6
Кажется, к сожалению, это занимает столько же времени, сколько и просмотр фильма, но кажется, что он работает. MattPark 9 лет назад 1
Пример ошибки из файла с обрезанным концом: `[mov, mp4, m4a, 3gp, 3g2, mj2 @ 0x161a180] moov atom не найден video-head.mp4: при обработке ввода были найдены неверные данные StackAbstraction 9 лет назад 0
Если, как указывает ОП, «загрузка прерывается в середине… загрузки», очень вероятно, что * все * потоки будут прерваны, поэтому вы можете обнаружить эту ошибку, ограничив декодирование * только одной звуковой дорожкой * (используя `-map`), что значительно ускорит работу:` ffmpeg -v error -i in.mkv -map 0: 1 -f null… `В случае ошибки будет записана позиция байта, которая Вы можете использовать его для обрезания файла (мегабайт или два ранее, чтобы быть в безопасности), а затем возобновить загрузку. Lumi 9 лет назад 1
добавление -map 0: 1 намного быстрее, но приводит к большому количеству `Выходной файл # 0 не содержит никакого потока` MattPark 7 лет назад 0
Мне потребовалось 4,5 с половиной минуты, чтобы протестировать файл .mkv длиной 1 ГБ и 1 час на старом шестнадцатеричном процессоре. Все ядра были максимальны во время теста. Я отредактировал копию файла и добавил несколько блоков 00, чтобы имитировать повреждение. Журнал ошибок сообщал об ошибках правильно. Файлы без ошибок вернули пустой error.log TripleAntigen 7 лет назад 2
7
pfalcon

Мне понравилась идея использования ffmpeg -f nullвыше, но я бы хотел автоматизировать процесс использования этого вывода. В частности, общий сценарий, который у меня есть с моей коллекцией музыкальных видео, состоит в том, что у меня есть несколько клипов с одинаковым разрешением, и я хотел бы просмотреть журналы проверки для этих файлов, чтобы удалить наиболее поврежденные.

К сожалению, пока у ffmpeg нет способа отключить интерактивный режим, который выводит шум для этого случая использования. В итоге я взломал простой скрипт-обертку для фильтрации:

#!/usr/bin/env python import sys import os import re  t = os.popen('ffmpeg -v 5 -i "%s" -f null - 2>&1' % sys.argv[1]).read() t = re.sub(r"frame=.+?\r", "", t) t = re.sub(r"\[(.+?) @ 0x.+?\]", "[\\1]", t) print t 

Пример вывода:

[mpeg1video]ac-tex damaged at 21 17 [mpeg1video]Warning MVs not available [mpeg1video]concealing 22 DC, 22 AC, 22 MV errors [mpeg1video]Warning MVs not available [mpeg1video]concealing 22 DC, 22 AC, 22 MV errors [mpeg1video]ac-tex damaged at 13 9 
если вы сделаете так, чтобы он заменял сломанные детали хорошими, это было бы еще лучше akostadinov 7 лет назад 1
Я получаю ошибку, используя это: Akshit Rewari 7 лет назад 0
Traceback (последний вызов был последним): файл "F: \ filecheck.py", строка 6, в t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1'% sys.argv [1]). read () IndexError: список индексов вне диапазона Akshit Rewari 7 лет назад 1
0
Shevek

MediaInfo - это отличный инструмент для получения информации о любом видеофайле, который вы хотите добавить. Это может быть в состоянии выделить информацию, которую вы хотите.

Другим инструментом является GSpot, но он не обновлялся с 2007 года.

Попробуйте дать каждому известный хороший и известный плохой файл и сравните результаты.

Я использовал GSpot до тех пор, пока он не перестал обновляться, а затем переключился на MediaInfo

У меня есть старая версия GSpot на моей машине ... но это инструмент для чего-то совершенно другого (определение кода / декодирования ...). Это не имеет ничего общего с этим. Я проверю mediainfo. Rook 14 лет назад 1
GSpot сообщит, если размер файла или количество кадров не соответствуют ожидаемому от индекса (где-то с левой стороны, это было давно, так как я использовал его!), Также более поздние версии добавили много функциональности. Shevek 14 лет назад 0
** mediainfo ** может рекурсивно сканировать каталоги: чтобы получить отчет обо всех файлах любого уровня, начиная с текущей папки, просто запустите `mediainfo *`. ccpizza 8 лет назад 0
`mediainfo`, по-видимому, не проверяет полноту. Я взял 33 МБ видеофайла `webm` и` обрезал` его до половины. `mediainfo` по-прежнему выдает почти одинаковый результат для обоих, без явных признаков коррупции. После `усечения 'до 1 МБ в выводе все еще не было явных признаков повреждения. Только если вы глубже взглянули на вывод, появилась некоторая противоречивая информация. Но эти части зависят от формата видеофайла, поэтому вы не можете автоматизировать это обнаружение. Tino 7 лет назад 1
`mediainfo` не читает ничего, кроме метаданных. Это никоим образом не проверяет достоверность вашего файла. DanielSmedegaardBuus 6 лет назад 2
0
Juan Antonio Tubío

Для окон вы можете «пакетно» проверить целостность видео в текущей папке и всех подпапках с помощью этого bat-файла:

checkvideo.bat

@echo off  set "filtro=%1" if [%filtro%]==[] ( set "filtro=*.mp4" )  for /R %%a in (%filtro%) do call :doWork "%%a"  PAUSE exit /B  :doWork C:\ffmpeg\bin\ffmpeg.exe -v error -i %1 -f null - > "%~1.log" 2>&1 

Использование:

checkvideo.bat [filter]

Если вы не дадите один фильтр, получите «* .mp4».

Образцы: checkvideo.bat checkvideo.bat *.avi

Установка: Загрузите FFmpeg для Windows отсюда: https://ffmpeg.zeranoe.com/builds/ и разархивируйте их. Измените C:\ffmpeg\bin\в файле bat путь, по которому вы разархивировали. Ffmpeg Поместите checkvideo.batпапку, включенную в путь, или добавьте его в папку Переменная окружения пути

** Ответ Хуана Антонио Тубио ** работает для меня, чтобы проверить целостность видео. Но как я могу прочитать файл журнала и определить время, когда видео повреждено. Пример журнала. [h264 @ 00000173649787c0] Ошибка декодирования Cabac из qscale diff при 64 7 Ошибка [h264 @ 00000173649787c0] при декодировании MB 64 7, bytestream 38638 J.Duck 6 лет назад 0
0
shivams

Проблема с другим ответом, используемым ffmpegдля перекодирования в nullформатирование, заключается в том, что это занимает действительно много времени. Особенно, если вы хотите проверить несколько файлов в каталоге.

Быстрый способ - создать миниатюры для всех видео и посмотреть, где не удается создать миниатюру.

find . -iname "*.mp4" | while read -r line; do  line=`echo "$line" | sed -r 's/^\W+//g'`;  echo 'HERE IT IS ==>' "$line";  if ffmpeg -i "$line" -t 2 -r 0.5 %d.jpg;  then echo "DONE for" "$line";  else echo "FAILED for" "$line" >>error.log;  fi;  done; 

Этот метод оказался намного быстрее, чем другие методы.

Тем не менее, есть CAVEAT. Этот метод может дать неправильные результаты, потому что иногда миниатюра может быть сгенерирована даже для поврежденных файлов. Например, если видеофайл поврежден только в конце, этот метод не удастся.