1
Software / Re:FFmpeg: jak validovat multimediální soubor?
« Poslední příspěvek od Michal Šmucr kdy Dnes v 15:45:50 »Já chápu, co je záměrem.
Ale bohužel o tom je právě celá ta debata.. Pro omezení chyb při následném zpracování nestačí jen vydetekovat typ souboru, a identifikovat streamy. Pokud to má spolehlivě validovat a pracovat s různými formáty souborů, co se od sebe zásadně liší, tak je potřeba důkladnější analýza. Ta pak logicky v závislosti na typu souboru vyžaduje nějaký čas.
A jak jsem psal, není to úplně jednoduché, opravdu nestačil jen ffmpeg, musel jsem kombinovat víc nástrojů a stejně jsem pokryl pouze část.
ffmpeg se v podstatě bez dalšího nastavení podívá jen na začátek vstupního souboru (podle -analyzeduration, resp. -probesize) a identifikují se základní parametry kontejneru a streamů, což se pak případně použije na nastavení demuxeru a dekodérů. To je celé, nemá to ambici hledat chyby ve struktuře souboru nebo datových blocích.
ffprobe pak může jít případně dál, procházet streamy (show_frames, show_packets, spočítat hashe atp.) a potencionálně nějaké evidentní věci odhalit, ale zas to bude záležet na formátu a konkrétním typu chyby - obecně bych na to moc nesázel.
Samozřejmě si můžete třeba vyhodnotit, že to nemá smysl řešit a jen reagovat na chyby při kódování.. Pokud vám ffmpeg vyhodí při následném transkódování problém, soubor vyhodíte a notifikujete uživatele. Návratové kódy nejsou 100%, ale když to třeba rozjedete s -v warning a budete parsovat stderr na výskyt určitých slov, tak můžete odchytit poměrně dost problémů.
Jak už jsem zmiňoval, tak některé zásadnější problémy dokáže docela dobře odhalit mediainfo, kterým můžete v nahradit i ten ffprobe na prvotní identifikaci. Dobře se s tím pracuje, v JSONu to vrací pole ConformanceErrors s případnými chybami.
Ale zas, jestli to zafunguje, bude záležet na typu toho problému (např. úplně chybějící kus souboru vs. pár flipnutých nebo zapadovaných bitů někdě v půlce). Můžete si jednoduše vyzkoušet, jestli vám řekne něco k té MP3ce (podle hlášky z ffmpegu mi to nepřijde jako chyba hlavičky, ale jeden nebo více poškozených rámců) a uvidíte.
Ale podobně jako ffprobe je to také nástroj primárně navržený na rychlou identifikaci vlastností souboru, ne na hloubkovou analýzu. Kterou, pokud budete chtít, tak musíte pořešit většinou dedikovaným nástrojem nebo prostě reagovat na chyby návazného transkodéru.
Zdaleka nejrobustnější je použití interních checksumů v hlavičce pro relativně rychlou externí validaci (byť s přečtením a počítáním hashe z téměř celého souboru), což odhalí i jakékoliv drobné chyby v celém řetězci, ale to je bohužel záležitost spíš bezztrátových audio formátů (BWF, FLAC, WavPack) nebo "profi" video kontejnerů (MXF s AS-07 rozšířením pro archivaci) a nedá se to využít u většiny běžných formátů.
Ale bohužel o tom je právě celá ta debata.. Pro omezení chyb při následném zpracování nestačí jen vydetekovat typ souboru, a identifikovat streamy. Pokud to má spolehlivě validovat a pracovat s různými formáty souborů, co se od sebe zásadně liší, tak je potřeba důkladnější analýza. Ta pak logicky v závislosti na typu souboru vyžaduje nějaký čas.
A jak jsem psal, není to úplně jednoduché, opravdu nestačil jen ffmpeg, musel jsem kombinovat víc nástrojů a stejně jsem pokryl pouze část.
ffmpeg se v podstatě bez dalšího nastavení podívá jen na začátek vstupního souboru (podle -analyzeduration, resp. -probesize) a identifikují se základní parametry kontejneru a streamů, což se pak případně použije na nastavení demuxeru a dekodérů. To je celé, nemá to ambici hledat chyby ve struktuře souboru nebo datových blocích.
ffprobe pak může jít případně dál, procházet streamy (show_frames, show_packets, spočítat hashe atp.) a potencionálně nějaké evidentní věci odhalit, ale zas to bude záležet na formátu a konkrétním typu chyby - obecně bych na to moc nesázel.
Samozřejmě si můžete třeba vyhodnotit, že to nemá smysl řešit a jen reagovat na chyby při kódování.. Pokud vám ffmpeg vyhodí při následném transkódování problém, soubor vyhodíte a notifikujete uživatele. Návratové kódy nejsou 100%, ale když to třeba rozjedete s -v warning a budete parsovat stderr na výskyt určitých slov, tak můžete odchytit poměrně dost problémů.
Jak už jsem zmiňoval, tak některé zásadnější problémy dokáže docela dobře odhalit mediainfo, kterým můžete v nahradit i ten ffprobe na prvotní identifikaci. Dobře se s tím pracuje, v JSONu to vrací pole ConformanceErrors s případnými chybami.
Ale zas, jestli to zafunguje, bude záležet na typu toho problému (např. úplně chybějící kus souboru vs. pár flipnutých nebo zapadovaných bitů někdě v půlce). Můžete si jednoduše vyzkoušet, jestli vám řekne něco k té MP3ce (podle hlášky z ffmpegu mi to nepřijde jako chyba hlavičky, ale jeden nebo více poškozených rámců) a uvidíte.
Ale podobně jako ffprobe je to také nástroj primárně navržený na rychlou identifikaci vlastností souboru, ne na hloubkovou analýzu. Kterou, pokud budete chtít, tak musíte pořešit většinou dedikovaným nástrojem nebo prostě reagovat na chyby návazného transkodéru.
Zdaleka nejrobustnější je použití interních checksumů v hlavičce pro relativně rychlou externí validaci (byť s přečtením a počítáním hashe z téměř celého souboru), což odhalí i jakékoliv drobné chyby v celém řetězci, ale to je bohužel záležitost spíš bezztrátových audio formátů (BWF, FLAC, WavPack) nebo "profi" video kontejnerů (MXF s AS-07 rozšířením pro archivaci) a nedá se to využít u většiny běžných formátů.