2010-01-25 12:54:46 +0000 2010-01-25 12:54:46 +0000
130
130

Hoe kan ik de integriteit van een videobestand (avi, mpeg, mp4...) controleren?

Deze titel kan wat misleidend zijn, dus laat me het uitleggen …

Ik ben een videobestand aan het downloaden … mpeg, avi - zijnde een van de populaire formaten. Nu, als ik het aan het downloaden ben, en de download breekt midden in de uhm … download, dan, bijvoorbeeld, zal Windows Media Player een foutmelding geven en weigeren het af te spelen (hoewel het bestand, laten we zeggen, 98% compleet is). Maar spelers als KMPlayer, of MediaPlayer Classic zullen het tot op dat punt wel afspelen (trouwens, zij kunnen het ook afspelen terwijl het gedownload wordt).

Dus, ik ben geïnteresseerd, … zonder gebruik te maken van enig download middel (download managers en dergelijke) om er zeker van te zijn dat het bestand volledig is gedownload, hoe kan men verifiëren of het videobestand in zijn geheel is gedownload, en dat het volledig is?

Antwoorden (7)

137
137
137
2010-01-25 13:05:22 +0000

U kunt gebruik maken van een functie in ffmpeg video converter: als u het opgeeft om video te hercoderen naar niets, zal het alleen invoerbestand lezen en alle fouten rapporteren die zullen verschijnen. Dit is een zeer snel proces omdat video frames alleen worden gelezen, gecontroleerd en geruisloos worden verwijderd.

Voorbeeld opdrachtregel: (voor Linux)

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

-v error betekent een bepaald niveau van verbositeit (om sommige fouten te tonen die normaal verborgen zijn omdat ze de afspeelbaarheid niet veel beïnvloeden).

Je krijgt een volledig error log met wat generieke informatie over het bestand dat ffmpeg uitvoert, dus dit zal waarschijnlijk je aandacht nodig hebben, via filters die geschreven kunnen worden om een batch check van soortgelijke bestanden uit te voeren.

FFmpeg is ook beschikbaar voor Windows hier . De opdrachtregel zal bijna identiek zijn met uitzondering van stderr redirect:

ffmpeg.exe -v error -i file.avi -f null - >error.log 2>&1
14
14
14
2011-09-22 17:05:59 +0000

Ik vond het idee om ffmpeg -f null te gebruiken leuk, maar ik zou eigenlijk het proces om die uitvoer te gebruiken willen automatiseren. In het bijzonder, een veel voorkomend scenario dat ik heb met mijn muziek video collectie is dat ik een paar clips heb die dezelfde resolutie hebben, en ik zou graag de verificatie logs voor die bestanden willen vergelijken om degene die het meest kapot zijn te verwijderen.

Helaas heeft ffmpeg tot nu toe geen manier om zijn interactieve modus uit te schakelen, die ruis produceert voor dit geval van gebruik. Ik heb uiteindelijk een eenvoudig wrapper script gehackt om de filtering te doen:

#!/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

Voorbeeld uitvoer:

[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
1
1
2017-08-15 14:13:33 +0000

Voor windows kun je de integriteit van video’s in de huidige map en alle submappen ‘batchgewijs’ controleren met dit bat-bestand:

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

Gebruik:

checkvideo.bat [filter]

Als je geen filter geeft, krijg je ‘*.mp4’.

Monsters: checkvideo.batcheckvideo.bat *.avi

Setup: Download FFmpeg voor Windows van hier: https://ffmpeg.zeranoe.com/builds/ en pak ze uit Verander `C:\ffmpeg\binVoor windows kun je de integriteit van video’s in de huidige map en alle submappen ‘batchgewijs’ controleren met dit bat-bestand:

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

Gebruik:

checkvideo.bat [filter]

Als je geen filter geeft, krijg je ‘*.mp4’.

Monsters: checkvideo.batcheckvideo.bat *.avi

Setup: Download FFmpeg voor Windows van hier: [ https://ffmpeg.zeranoe.com/builds/ ]0x3& en pak ze uit Verander in het bat bestand voor het pad waar je ffmpeg hebt uitgepakt Zet checkvideo.bat op een map in het Pad of voeg zijn map toe aan Pad omgevingsvariabele

0
0
0
2020-01-12 11:14:29 +0000

fluent-ffmpeg

var ffmpeg = require('fluent-ffmpeg');
var ff = new ffmpeg();

ff.on('start', function(commandLine) {
  // on start, you can verify the command line to be used
})
.on('progress', function(data) {
  // do something with progress data if you like
})
.on('end', function() {
  // do something when complete
})
.on('error', function(err, stdout, stderr) {
  // handle error conditions
  console.log('Error: ' + err.message)
  console.log('ffmpeg output:\n' + stdout)
  console.log('ffmpeg stderr:\n' + stderr)
})
.addInput('path\to\file')
.addInputOption('-xerror')
.addInputOption('-v error')
.output('-')
.outputOptions('-f null')
.run();

Reference: https://stackoverflow.com/questions/43349360/how-to-check-for-corrupted-webm-video-using-node-js-and-fluent-ffmpeg

0
0
0
2019-11-12 09:31:47 +0000

Eenvoudiger versie

for file in *.mp4; do ffmpeg -v error -i "$file" -f null - >error.log 2>&1; print "$file"; done

Dit zal de bestandsnaam afdrukken terwijl ze verwerkt worden.

error.log zal de fouten bevatten.

0
0
0
2010-01-25 13:13:15 +0000

MediaInfo ](http://mediainfo.sourceforge.net/) is een geweldig hulpmiddel om informatie te krijgen over elk videobestand dat je maar wilt. Dit kan in staat zijn om de info die u wilt te markeren.

Een andere tool is GSpot maar die is sinds 2007 niet meer bijgewerkt.

Probeer elk een bekend goed en een bekend slecht bestand te geven en vergelijk de resultaten.

Ik gebruikte GSpot totdat het niet meer geupdate werd, toen ben ik overgestapt op MediaInfo

0
0
0
2018-04-11 12:16:24 +0000

Het probleem met het andere antwoord dat ffmpeg gebruikt om te hercoderen naar null formaat is dat het erg lang duurt. Vooral als je meerdere bestanden in een map wilt controleren.

Een snelle manier zou zijn om thumbnails te genereren voor alle video’s, en te kijken waar het genereren van thumbnails mislukt.

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;

Deze methode bleek veel SNELLER te zijn dan andere methoden.

Er is echter een CAVEAT. Deze methode kan verkeerde resultaten opleveren, omdat soms zelfs voor corrupte bestanden een thumbnail kan worden gegenereerd. Als het videobestand bijvoorbeeld alleen aan het eind corrupt is, zal deze methode falen.