115

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

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

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

5 ответов5

119

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

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

0

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .