it-swarm-ru.tech

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

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

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

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

120
Rook

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

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

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

1
shivams

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

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

0
Juan Antonio Tubío

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

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

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

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

0
Shevek