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


126

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

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

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


Неполный MPEG должен играть без проблем. AVI имеет индексы для быстрого поиска в конце файла, которые некоторые проигрыватели будут использовать, а некоторые не требуют или будут игнорировать.
бобинце

7
Incomplete MPEG should play with no problems.@bobince, вопрос был в том, как проверить наличие повреждений, а не как воспроизвести неполный файл. Даже если формат поддерживает воспроизведение неполных файлов, все равно должна быть возможность проверить наличие повреждений, если файл не соответствует спецификациям формата. Например, вы все еще можете прочитать неполный текстовый файл, но вы все равно можете определить, есть ли у файла проблемы, например, заканчивается ли он в середине предложения или есть фрагмент явно пропущенной информации в середине.
Synetech

Ответы:


135

Вы можете использовать функцию в 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

5
Та же скорость, что и при конвертации.
Кто-то

8
Другой вариант, ffprobeкоторый поставляется в комплекте с ffmpeg. Он не выполняет никакого преобразования, а просто читает информацию метаданных из файла. Поэтому он обнаружит ошибки в метаданных, но не обнаружит никаких проблем в самом файле. Лично использую ffprobeдля быстрой проверки загруженных данных перед дальнейшей обработкой
mente

1
Кажется, это занимает столько же времени, сколько и просмотр фильма, но, похоже, он работает
MattPark,

3
Если, как указывает ОП, «загрузка прерывается в середине… загрузки», очень вероятно, что все потоки будут прерваны, поэтому вы можете обнаружить эту ошибку, ограничив декодирование только одной звуковой дорожкой (используя -map), что значительно ускорит работу: в ffmpeg -v error -i in.mkv -map 0:1 -f null …случае ошибки будет занесена позиция байта, которую вы можете использовать для усечения файла (мегабайт или два ранее, чтобы быть в безопасности), а затем возобновить загрузку.
Луми

3
Мне понадобилось около 4,5 минут, чтобы протестировать файл .mkv длиной 1 ГБ и 1 час на старом шестнадцатеричном процессоре. Все ядра были максимальны во время теста. Я отредактировал копию файла и добавил несколько блоков 00, чтобы имитировать повреждение. Журнал ошибок сообщал об ошибках правильно. Файлы без ошибок вернули пустой error.log
TripleAntigen

12

Мне понравилась идея использования 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

1
если сделать так, чтобы он заменял сломанные детали хорошими, это было бы еще лучше
akostadinov

Я получаю сообщение об ошибке, используя это:
Акшит Ревари

2
Traceback (последний вызов был последним): файл "F: \ filecheck.py", строка 6, в <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: список индексов вне диапазона
Акшит Ревари,

1

Для окон вы можете «пакетно» проверить целостность видео в текущей папке и всех подпапках с помощью этого 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
Дж. Дак

1

Проблема с другим ответом, используемым 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. Этот метод может дать неправильные результаты, потому что иногда миниатюра может быть сгенерирована даже для поврежденных файлов. Например, если видеофайл поврежден только в конце, этот метод не удастся.


0

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

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

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

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


1
У меня есть старая версия GSpot на моей машине ... но это инструмент для чего-то совершенно другого (определение кода / декодирования ...). Это не имеет ничего общего с этим. Я проверю mediainfo.
Ладья

GSpot сообщит, если размер файла или количество кадров не соответствуют ожидаемому от индекса (где-то с левой стороны, это было давно, так как я использовал это!), Также более поздние версии добавили много функциональности.
Шевек

mediainfo может рекурсивно сканировать каталоги: чтобы получить отчет обо всех файлах любого уровня, начиная с текущей папки, просто запустите mediainfo *.
ccpizza

1
mediainfoвидимо не проверяет на полноту. Я взял 33 МБ webmвидеофайл и сделал truncateего наполовину. mediainfoу обоих был почти одинаковый результат для обоих, без видимых признаков коррупции. После truncateувеличения до 1 МБ на выходе все еще не было явных признаков повреждения. Только если вы глубже взглянули на вывод, появилась некоторая противоречивая информация. Но эти части зависят от формата видеофайла, поэтому вы не можете автоматизировать это обнаружение.
Тино

3
mediainfoне читает ничего, кроме метаданных. Это не будет проверять действительность вашего файла в любом случае.
DanielSmedegaardBuus
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.