Как проверить, полностью ли загружено видео?

10

У меня есть куча видео, которые я хочу проверить, завершены они или нет. Некоторые из них могут быть загружены частично, но они не являются неисправными. Как я могу эффективно проверить, полностью ли загружено это видео?

Если бы у меня были ссылки, я бы проверил их размер, но у меня их нет.

Я пытался использовать ffprobeи mediainfo. ffprobeсообщает о незначительных проблемах с частично загруженными файлами, но также сообщает о похожих проблемах с некоторыми из полностью загруженных файлов. Должен ли я использовать ffmpegдля чтения целых файлов и сравнения длины видео, чтобы проверить, если они загружены? Есть ли лучшее решение?

HO1
источник
Вы говорите о файлах, которые в данный момент загружаются, то есть загружающая их программа все еще записывает данные в файл, когда получает больше данных? Или вы говорите о файлах, загрузка которых была прервана в какой-то момент в прошлом?
Жиль "ТАК - перестань быть злым"
@Gilles The были загружены в прошлом, и теперь некоторые из этих файлов являются неполными. Я хочу найти неполные видеофайлы, чтобы вручную найти ссылки и возобновить загрузку.
Ho1
@ Ho1 мой ответ удовлетворил твой вопрос?
J363
@ J363 Спасибо за ваш ответ. Не могли бы вы ответить на мой комментарий?
Ho1

Ответы:

11

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

ffmpeg -v error -i FILENAME.mp4 -f null - 2>test.log

Если видеофайл загружен не полностью, в файле test.log будет много строк. Например, 0,1 МБ, отсутствующие в видеофайле, выдало 71 строку ошибок. Если видео полностью загружено и не было повреждено, ошибок не обнаружено, и в test.log не выводятся строки.


редактировать

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

Добавление -sseof -60в список аргументов проверит последние 60 секунд файла, что значительно быстрее.

ffmpeg -v error -sseof -60 -i FILENAME.mp4 -f null - 2>test.log

Вам понадобится более новая версия ffmpeg, в 2.8 отсутствовал флаг sseof, поэтому я использовал 3.0.

J363
источник
1
Это работает как-то, но требует обработки всего видео. В качестве альтернативного метода я обнаружил, что открытие видео в VLC, нажатие где-то ближе к концу занимает меньше времени и является более практичным. Можно ли определить подобную вещь в ffmpeg? Я имею в виду поиск до 99% без обработки всего видео и проверку, работает ли он без ошибок.
Ho1
@ Ho1 смотрите обновленную команду.
J363
1
Я уверен, что команда работает, потому что я тестировал ее несколько раз с флагом -sseof и без него. Исходная команда проверяет весь файл, что является предлагаемым поведением. Запрошенная вами измененная команда подтверждает предположение, что данные отсутствуют в конце файла в команде, что может быть не так. Мой тестовый файл - 99,9% от 137 МБ mp4, загруженного с помощью торрент-клиента. Когда я использую флаг -sseof и постепенно увеличиваю количество времени, которое он просматривает в обратном направлении, я в итоге получаю точно такой же вывод, как если бы я выполнил команду, просматривая весь файл.
J363
1
С помощью -ssи -sseof, ffmpeg читает и обрабатывает весь файл. Так что, в любом случае, открытие видео в VLC и нажатие ближе к концу будет быстрее.
Ho1
1
Вы правы, но я скачиваю по http.
Ho1
7

MediaInfo отображает строку:

Truncated: Yes

если файл не завершен, как ожидалось спецификациями формата.

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

Можно провести еще один (расширенный) тест, например, прочитав индекс файла .mp4 и проверив, что смещение файла + размер кадра последнего кадра соответствуют размеру файла, который вы получаете, но это не совсем то, что вы ищете для (если в исходном файле есть метаданные, например, плакаты, в конце файла, и файл усекается непосредственно перед этим плакатом, частичная загрузка все еще не обнаруживается в каждом случае). Он не реализован в MediaInfo, но вы можете добавить запрос функции MediaInfo .

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

PS: этот вопрос не является специфическим для любой операционной системы.

Жером Мартинес
источник
Спасибо за Ваш ответ. Я не хочу точного ответа, для меня будет достаточно приблизительного ответа. Как вы думаете, этот вопрос следует перенести на superuser.com?
Ho1
Я не мог получить такое поле, даже используя mediainfo версии v0.7.83 используя -f(отображение полной информации). Не могли бы вы помочь получить Truncatedполе?
Ho1
Просто удалите 1 байт в вашем файле, и у вас должно появиться это «усеченное» поле (не нужно -f, достаточно вывода по умолчанию). К вашему сведению это реализовано для наиболее используемых сегодня форматов: MP4 / MOV, Matroska, MXF. вы тестируете с другим форматом?
Жером Мартинес
2
Большое спасибо за ответ. Чтобы проверить много файлов одновременно, я использовал следующее: mediainfo * | grep -E "^(IsTruncated|Complete name)"где имя файла соответствующего файла отображается прямо над строкой «IsTruncated: Yes».
0x01
4

У меня был файл, где ffmpeg (v3.1.1) с -sseof -60 не показывал никаких предупреждений и просто выходил без указания, что что-то не так. Mediainfo также не показала, что файл был усечен. Только отсутствие -sseof -60 сообщит о любой ошибке с ffmpeg. Итак, я вернулся к попытке ffprobe. Казалось, немного быстрее, чем ffmpeg.

ffprobe -v error -count_frames -i filename.mp4

произвел этот вывод

[h264 @ 00000000004e6a60] Invalid NAL unit size.
[h264 @ 00000000004e6a60] Error splitting the input into NAL units.
[mov,mp4,m4a,3gp,3g2,mj2 @ 00000000004e5280] stream 1, offset 0x1350135: partial file

Я еще не встречал никаких ложных срабатываний (как сообщает ОП).

Изменить : ffprobe был в моих тестовых файлах примерно на 10% быстрее, чем ffmpeg, но только если вы указали ему использовать все ядра с опцией '-threads 0'. В противном случае он использует только одно ядро ​​/ поток и работает медленнее.

Ян Эрхардт
источник
Это не дает ответа на вопрос. Как только у вас будет достаточно репутации, вы сможете комментировать любой пост ; вместо этого предоставьте ответы, которые не требуют разъяснений от автора . - Из обзора
Брайам
@Braiam Это действительно отвечает на вопрос, потому что скачанный файл не будет выводить, а неполный файл будет.
Ян Эрхардт