비디오 파일 (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 redirect를 제외하면 거의 동일합니다.

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1

5
마치 변환하는 것과 같은 속도입니다.
누군가

8
또 다른 옵션은 ffprobe패키지와 함께 제공됩니다 ffmpeg. 변환하지 않고 파일에서 메타 데이터 정보를 읽습니다. 따라서 메타 데이터의 오류를 감지하지만 파일 자체에서 문제를 찾지는 않습니다. 개인적 사용하여 ffprobe더 처리하기 전에 업로드를 빠르게 확인하기 위해
mente

1
불행히도 영화를 보는 한 오래 걸리는 것 같지만 효과가있는 것 같습니다
MattPark

3
OP에 "uhm ... download 중간에 다운로드가 중단됨"이 표시되면 모든 스트림이 중단 될 가능성이 매우 높 으므로 디코딩을 하나의 오디오 트랙 으로 제한 하여 (을 사용하여 -map) 이 오류를 감지 할 수 있습니다 . 작업 속도가 크게 향상됩니다. ffmpeg -v error -i in.mkv -map 0:1 -f null …오류가 발생하면 바이트 위치를 기록하여 파일을 자르고 (안전을 위해 메가 바이트 또는 2 초 전) 다운로드를 다시 시작할 수 있습니다.
Lumi

3
오래된 16 진수 코어 프로세서에서 1GB 1 시간 길이의 .mkv 파일을 테스트하는 데 4 1/2 분이 걸렸습니다. 시험 동안 모든 코어를 최대화 하였다. 16 진수로 파일 사본을 편집하고 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 행 t = os.popen ( 'ffmpeg -v 5 -i "% s"-f null-2> & 1' % sys.argv [1]). read () IndexError : 목록 색인이 범위를
벗어남

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

설정 : 여기에서 Windows 용는 FFmpeg 다운로드 : https://ffmpeg.zeranoe.com/builds/ 그들을 변경 압축을 풉니 다 C:\ffmpeg\bin\당신이 넣어는 FFmpeg 압축 해제 한 경로에 대한 박쥐 파일 checkvideo.bat폴더에를 경로에 포함하거나 자신의 폴더를 추가 경로 환경 변수


Juan Antonio Tubío 의 답변은 비디오 무결성을 확인하기 위해 노력하고 있습니다. 그러나 로그 파일을 읽고 비디오가 손상된 시간을 어떻게 감지 할 수 있습니까? 로그 예. 64 MB 7 복호화하면서 qscale DIFF 여기서 H264 @ 00000173649787c0] CABAC 디코드 64 7 H264 @ 00000173649787c0] 에러에서 38,638 바이트 스트림에 실패
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이 있지만 완전히 다른 무언가를위한 도구입니다 (코드 / 디코딩 결정 ...). 이것과 관련이 없습니다. mediainfo를 확인하겠습니다.
Rook

GSpot은 파일 크기 또는 프레임 수가 색인에서 예상 한 것과 일치하지 않는지보고합니다 (왼쪽 어딘가에서 사용한 지 오래되었습니다!). 또한 이후 버전에서는 많은 기능이 추가되었습니다.
Shevek

mediainfo 는 디렉토리를 재귀 적으로 검색 할 수 있습니다 mediainfo *. 현재 폴더에서 시작하는 모든 수준의 모든 파일에 대한 보고서를 얻으려면 간단히 실행하십시오 .
ccpizza 2016 년

1
mediainfo분명히 완전성을 검사하지 않습니다. 나는 33MB webm비디오 파일을 가져 와서 truncate반으로 줄였습니다. mediainfo여전히 부패의 흔적이 전혀없는 두 가지 모두에 대해 거의 동일한 결과를 얻었습니다. 후 truncate가 1메가바이트에 보내고 여전히 출력 부패의 명확한 기호 없었다. 결과를 자세히 살펴본 경우에만 모순되는 정보가있었습니다. 그러나 이러한 부분은 비디오 파일 형식에 따라 다르므로이 탐지를 자동화 할 수 없습니다.
Tino

3
mediainfo메타 데이터 외에는 아무것도 읽지 않습니다. 이것은 어떤 식 으로든 파일의 유효성을 검사하지 않습니다.
DanielSmedegaardBuus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.