Як я можу перевірити цілісність відеофайлу (avi, mpeg, mp4…)?


126

Ця назва може бути дещо оманливою, тому дозвольте мені пояснити ...

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

Отже, мені цікаво, ... не використовуючи жодних засобів завантаження (менеджерів завантажень тощо), щоб захистити файл повністю завантажений, як можна перевірити, чи завантажується відеофайл цілим, і чи є він повним?


Неповний MPEG повинен грати без проблем. AVI має індекси для швидкого пошуку в кінці файлу, які деякі гравці використовуватимуть, а деякі не потребують або ігнорують.
bobince

7
Incomplete MPEG should play with no problems.@bobince, питання / було як перевірити наявність корупції, а не як відтворити неповний файл. Навіть якщо формат підтримує відтворення неповних файлів, все одно слід перевірити наявність корупції, якщо файл не відповідає специфікаціям формату. Наприклад, ви все ще можете прочитати неповний файл простого тексту, але ви все одно можете виявити, чи є у файлу проблеми, як-от, якщо він закінчується в середині речення, або в середині є шматок явно відсутньої інформації.
Synetech

Відповіді:


135

Ви можете використовувати функцію у 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

5
Та сама швидкість, як ніби вона перетворюється.
Хтось

8
Ще один варіант, ffprobeякий постачається в комплекті з ffmpeg. Він не здійснює перетворення, а просто зчитує інформацію метаданих з файлу. Тому він виявить помилки в метаданих, але не знайде жодних проблем у самому файлі. Особисто використовуючи ffprobeдля швидкої перевірки завантажених даних перед подальшою обробкою
менте

1
Здається, це триває, на жаль, перегляд фільму, на жаль, але здається, що він працює
MattPark

3
Якщо, як заявляє ОП, "перерви в завантаженні в середині uhm ... скачати", дуже ймовірно, що всі потоки будуть порушені, тому ви можете виявити цю помилку, обмеживши розшифровку лише на одну звукову доріжку (використовуючи -map), що значно пришвидшить роботу: ffmpeg -v error -i in.mkv -map 0:1 -f null …Якщо виникла помилка, вона запише позицію байтів, яку ви можете використати для врізання файлу (мегабайт або два раніше, щоб бути безпечним), а потім відновити завантаження.
Лумі

3
Мені знадобилося, можливо, 4 1/2 хвилини, щоб протестувати .mkv-файл довжиною 1 Гб на 1 год на старому шестигранному процесорі. Під час випробування всі сердечники були змішані. Я hex відредагував копію файлу і додав кілька блоків 00, щоб імітувати пошкодження. Журнал помилок повідомив про помилки правильно. Файли без помилок повернули порожній error.log
TripleAntigen

12

Мені сподобалася ідея використання 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
якщо ви зробите так, щоб він замінив зламані частини хорошими частинами, це було б навіть краще
akostadinov

Я отримую помилку, використовуючи це:
Akshit Rewari

2
Відстеження (останній останній виклик): Файл "F: \ filecheck.py", рядок 6, в <module> t = os.popen ('ffmpeg -v 5 -i "% s" -f null - 2> & 1' % sys.argv [1]). read () IndexError: список індексів поза діапазоном
Akshit Rewari

1

Для Windows, ви можете "пакетно" перевірити цілісність відео для поточної папки та всіх папок із цим файлом 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папку, включену в Шлях, або додайте її в папку Змінна середовище шляху


Відповідь Хуана Антоніо Тубіо працює на мене, щоб перевірити цілісність відео. Але як я можу прочитати файл журналу та визначити час, де відео пошкоджено. Приклад журналу. [h264 @ 00000173649787c0] декодування кабаком qscale diff не вдалося на 64 7 [h264 @ 00000173649787c0] помилка під час декодування MB 64 7, bytestream 38638
J.Duck

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;

Цей метод виявився набагато швидшим, ніж інші методи.

Однак є КАВАТ. Цей метод може дати неправильні результати, оскільки іноді може створюватися мініатюра навіть для пошкоджених файлів. Наприклад, якщо відео-файл пошкоджений лише в кінці, цей спосіб не вдасться.


0

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

Інший інструмент - GSpot, але він не оновлювався з 2007 року.

Спробуйте надати кожному відомий хороший та відомий поганий файл та порівняйте результати.

Раніше я використовував GSpot, поки він не перестав оновлюватись, потім перейшов на MediaInfo


1
У мене на машині є стара версія GSpot ... але це інструмент для чогось зовсім іншого (визначення коду / декодування ...). Це не має нічого спільного з цим. Я перевірю медіаінфо.
Грак

GSpot повідомить, якщо розмір файлу чи кількість кадрів не відповідають очікуваному від індексу (десь ліворуч минуло деякий час, як я його використав!), А також пізніші версії додали багато функціональності.
Шевек

mediainfo може рекурсивно сканувати каталоги: для отримання звіту про всі файли будь-якого рівня, починаючи з поточної папки, просто запустіть mediainfo *.
ccpizza

1
mediainfoмабуть, не перевіряє повноти. Я взяв 33 Мб webmвідеофайлу і truncateдо половини. mediainfoвсе ще мав майже однаковий результат для обох, жодних очевидних ознак корупції. Після truncateотримання 1 МБ, все ще не було чітких ознак корупції у виході. Тільки якщо ви глибше подивились на результат, з'явилася якась суперечлива інформація. Але ці частини залежать від формату відеофайлу, тому ви не можете автоматизувати це виявлення.
Тіно

3
mediainfoне читає нічого, крім метаданих. Це ні в якому разі не перевірить дійсність вашого файлу.
DanielSmedegaardBuus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.