To poslední, co kamera zapíše
Někdo otevře příspěvek s videem a stiskne přehrát. Připojení je v pořádku. Video není velké. Chvíli se nic neděje, a pak se video spustí naráz, jako by čekalo na svolení.
Čekalo na rejstřík.
Proč sedí na konci
MP4 je hrstka boxů položených za sebou. Jeden z nich, mdat, je obraz a zvuk. Jiný, moov, je rejstřík: který snímek leží na kterém bajtu, jak dlouho to celé trvá, jakému kodeku to předat. Přehrávač potřebuje moov dřív, než může ukázat jediný snímek.

Kamera nemůže moov zapsat, dokud neskončí: do té doby neví, co v něm bude. Zapíše nejdřív obraz a rejstřík až nakonec. Dělá to tak každý telefon a stejně tak panel sdílení, který to, co telefon nahrál, přebaluje. Soubor je správně a přehraje se. Jen nutí čtenáře stáhnout ho celý, aby viděl první vteřinu.
Přesunout rejstřík na začátek umí jeden přepínač jednoho programu. V enginu ale dosud nebylo nic, co by tušilo, že taková otázka vůbec existuje.
Čtení, kde sedí
lib/video_probe.rb prochází boxy nejvyšší úrovně v souboru, u každého přečte čtyřbajtovou délku a čtyřbajtové jméno a přeskočí tělo. Žádný ffprobe, žádný gem – týž průchod boxy, který už čte rozměr snímku videa. Pokud moov přijde před mdat, soubor startuje rychle. Pokud až po něm, nestartuje.
Počítadlo kolem File#read, na čtyřicetimegabajtovém souboru s rejstříkem na konci: dvacet čtyři bajtů. Tři hlavičky boxů. Čtyřiceti megabajtů mezi nimi se nic nedotkne.
Odpovídá nil, ne false, když otázka nevyvstane – žádný moov, žádný mdat, nic, co by uměl rozebrat. „Nedokážu říci" a „špatně seřazeno" jsou různé odpovědi a jejich sloučení by hlásilo závadu u každého nečitelného souboru. Průchod také odmítá sestupovat dovnitř: mdat je plný bajtů, které mohou tvořit cokoli, včetně hlavičky boxu, která se čte jako moov.
Přesun na cestě dovnitř
media: remux_video: true v config/site.yml, a engine video přebalí ve chvíli, kdy se připojuje k příspěvku:
ffmpeg -nostdin -loglevel error -y -i IN -c copy -movflags +faststart OUT
-c copy je celé kouzlo: obraz a zvuk se překopírují jako bajty, nic se znovu nekóduje, o kvalitě se nic nerozhoduje. +faststart zapíše rejstřík jako první. QuickTimový .mov z toho vyjde jako .mp4, když už je to při tom, protože některé prohlížeče ten kontejner odmítají bez ohledu na to, co je uvnitř. .mp4, který projde přebalením, vyjde jako 01-web.mp4, ne 01.mp4: totéž jméno se nabízí, když autor spustí ffmpeg ručně, a ffmpeg odmítá svůj vlastní vstup.
Přebalení se počítá za hotové, jen pokud ffmpeg skončil čistě a zanechal soubor, ve kterém jsou bajty: nástroj, který zemře v půli, nechá useknutý soubor a přesto může skončit spokojeně, takže samotný návratový kód není odpověď.
Vyzkoušeno na třiceti skutečných videích z pracovního archivu s ffmpeg 7.1. Tři nesly rejstřík na konci. Všech třicet vyšlo s rychlým startem a každé si zachovalo délku, což je to, co dokazuje, že kopie je kopie.
Ta, která už v archivu jsou
check otevře videa, která archiv už drží, a pojmenuje ta s rejstříkem na konci, podle příspěvku a podle souboru:
klip: video 01.mp4 má rejstřík na konci souboru.
Vedle každého vypíše příkaz k přebalení – v obrysu, s FILE na místě jména – a nastavení, které to bude dělat při budoucích ukládáních. Je to varování, ne chyba: check odchází s nulou a počítá to za něco, co stojí za pohled, ne za problém. Soubor není rozbitý. Je pomalý, a o pomalém rozhoduje autor.
Při ukládání se táž věta objeví jen tam, kde dvě starší upozornění nemají co říci. Klip v HEVC a .mov už přicházejí s příkazem, který rejstřík přesune jako vedlejší účinek, a třetí příkaz pro jeden soubor je třetí věc k zvažování.
Co odmítá udělat
Potřebuje ffmpeg a bez něj nedělá nic. Se zapnutým nastavením a bez ffmpeg na stroji uložení řekne, že přebalení bylo přeskočeno, a uloží soubor tak, jak vstoupil.
Přebalení, které selže, také není odmítnutí. Příspěvek se uloží, video vstoupí tak, jak přišlo, a autor dostane větu, kterou by dostal s vypnutým nastavením. V tom je rozdíl proti převodu HEIC, který odmítá: fotka v HEIC se zobrazí v Safari a nikde jinde, zatímco video ve špatném obalu se skoro každému přehraje.
check nic neopravuje. Vypíše příkaz, a spustit ho je práce pro člověka.
Ve výchozím stavu je to vypnuté, jako všechno ostatní tady, co volá nástroj, který engine sám nedodává.
Co to stojí
Jednou nainstalovat ffmpeg. Při ukládání čas na překopírování jednoho souboru: cena sleduje velikost videa, ne délku kódování, ke kterému nikdy nedojde. A nic na archivu, který už leží na disku, dokud se příkazy, které check předá, nenapíší, jedno video po druhém.

Komentáře