У меня есть куча видеороликов, которые я хочу проверить, полны они или нет. Некоторые из них могут быть загружены частично, но они не неисправны. Как я могу эффективно проверить, полностью ли загружено это видео?
Если бы у меня были ссылки, я бы проверял их размер, но я этого не делаю.
Я пытался использовать ffprobe
и mediainfo
. ffprobe
сообщает о незначительных проблемах с частично загруженными файлами, но также сообщает о похожих проблемах с некоторыми полностью загруженными файлами. Должен ли я использовать ffmpeg
для чтения всех файлов и сравнить длину видео, чтобы проверить, загружены ли они? Есть ли лучшее решение?
ffmpeg – агностик, способный определять, полностью ли загружен видеофайл. Приведенная ниже команда дает команду ffmpeg читать входное видео и кодировать видео без изменений. Во время процесса кодирования любые ошибки, такие как отсутствующие кадры, выводятся в test.log.
ffmpeg -v error-i FILENAME.mp4 -f null - 2>test.log
Если видеофайл не загружен полностью, в файле test.log будет много строк. Например, .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.
MediaInfo отображает строку:
Truncated: Yes
если файл не является полным, как ожидалось, спецификациями формата.
Поскольку технически нет разницы между файлом, ошибочно (не отвечающим спецификациям о границах файлов), мультиплексированными и частично загруженными файлами, технически невозможно сделать разницу между багги-файлом и частично загруженным файлом.
Другой (расширенный) тест может быть выполнен, например, при чтении индекса файла .mp4 и проверке того, что размер файла + размер кадра последнего кадра находится в пределах размера файла, который вы получаете, но это не совсем то, что вы ищете для (если в исходном файле есть метаданные, например плакаты, в конце файла, а файл усечен непосредственно перед этим плакатом, частичная загрузка до сих пор не обнаружена в каждом случае). Он не реализован в MediaInfo, но вы можете добавить запрос функции MediaInfo .
Во всех случаях очень сложно обнаружить все частичные загрузки, поскольку общий размер файла не указан в большинстве форматов видеофайлов, поэтому вы можете быть уверены, что файл усечен, но вы не можете быть уверены, что файл не усечен. Единственный способ убедиться, что вы загрузили полный файл, – это получить размер файла из другого места (и лучше: иметь хэш, например MD5).
PS: этот вопрос не относится ни к какой операционной системе.
У меня был файл, где 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
Я еще не встречал никаких ложных срабатываний (как сообщает OP).
Изменить : ffprobe был на моих тестовых файлах примерно на 10% быстрее, чем ffmpeg, но только если вы поручите ему использовать все ядра с опцией '-threads 0'. В противном случае он использует только один ядро / поток и работает медленнее.