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

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

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

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

Комментарии к вопросу (2)

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

Мне понравилась идея использования 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
Комментарии (3)

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

checkvideo.летучая мышь

@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.летучая мышь [фильтр]

Если вы Don'т дать один фильтр, будет Вам '*.МР4'.

Образцы: checkvideo.летучая мышь checkvideo.летучая мышь *.Ави

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

Комментарии (1)

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

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

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;

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

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

Комментарии (0)

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

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

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

Я использовал GSpot, пока он не перестал обновляться, затем перешел на MediaInfo.

Комментарии (5)

Легкая версия

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done

Это позволит печатать имя файла, как они обрабатываются.

`ошибка.журнал будет содержать ошибки.

Комментарии (0)