Waarom een MP4 niet afspeelt, en wat een container echt is

Hoe containers als MP4 en MKV verschillen van codecs als H.264 en AV1, en hoe bitrate, keyframes, audiosporen en opnieuw coderen bepalen of een bestand afspeelt en hoe groot het wordt.

Een MP4 die niet afspeelt is zelden beschadigd. De extensie noemt alleen de container, de verpakking die de streams en hun tijdstempels bevat. Wat gedecodeerd moet worden is de codec erin, en dezelfde .mp4 kan H.264 bevatten die op een tien jaar oude telefoon speelt of AV1 waar een twee jaar oude televisie niet bij kan. Daarom speelt de ene MP4 wel en de andere niet.

Bij elk videobestand gelden twee vragen: in welke doos zit het, en hoe is het beeld gecomprimeerd. De doos veranderen is meestal gratis; de compressie veranderen nooit.

Een container is een doos, een codec is het beeld

ContainerVideocodecsAudioOndersteuning
MP4H.264, H.265, soms AV1AAC, MP3Overal
WebMVP8, VP9, AV1Opus, VorbisAlleen browsers
MKVVrijwel allesAC-3, DTS, van allesDesktopspelers, geen browsers
MOVH.264, H.265, ProResAAC, PCMApple, montage
AVIDivX, Xvid, MJPEGMP3, PCMOud Windows

MKV is de toegeeflijke container, prima voor archieven en slecht voor uitlevering: een geldige MKV kan een combinatie bevatten die geen enkele browser opent. MOV en MP4 delen het grootste deel van hun structuur, dus tussen de twee wisselen is vaak alleen een herschrijving van de index. Inspecteer het bestand:

input.mp4
  Stream #0:0  Video  h264 (High)   1920x1080  30 fps  4200 kb/s
  Stream #0:1  Audio  aac  (LC)     48000 Hz   stereo   128 kb/s

Het woord na "Video" is wat telt. Het woord "mp4" zegt je vrijwel niets.

Welke codec waar speelt

CodecBits voor gelijke kwaliteitLicentiesOndersteuning
H.264 (AVC)Uitgangspunt, noem het 100%Patentpool, vrijwel overal gelicentieerdUniverseel
H.265 (HEVC)50 tot 65%Concurrerende pools, duur, onopgelostApple ja, browsers wisselend
VP9Vergelijkbaar met H.265RoyaltyvrijChrome, Firefox, Edge, Android
AV130 tot 50%RoyaltyvrijActuele browsers, recente hardware

H.265 is technisch sterk en commercieel lastig, dus de ondersteuning splitst zich langs de lijnen van leveranciers in plaats van langs technische lijnen. AV1 comprimeert het best en codeert veel trager, soms een orde van grootte, dus hij past bij video die één keer gecodeerd en vaak bekeken wordt. Voor een onbekend publiek blijft H.264 in MP4 het antwoord, en Compress Video mikt daarop.

Bitrate, resolutie en beeldfrequentie

Bitrate is het aantal bits per seconde uitvoer, en dat alleen bepaalt de bestandsgrootte: vermenigvuldig met de duur en je hebt het bestand.

1920 x 1080 x 30 fps x 3 bytes = about 186 MB per second raw
delivered at 4 Mb/s            = about 0.5 MB per second

De resolutie verdubbelen verviervoudigt het aantal pixels maar niet het benodigde aantal bits, omdat naburige pixels in een groter beeld meer op elkaar lijken en beter comprimeren. Reken op twee tot drie keer zoveel, dus breedte en hoogte halveren is een van de goedkoopste manieren om een bestand te verkleinen: dat is Resize Video, en Crop Video gooit pixels regelrecht weg. De beeldfrequentie is milder en voegt van 30 naar 60 zo'n 20 tot 40% toe in plaats van 100%, terwijl Change Video Speed juist de tijdlijn inkort.

Er zijn drie manieren om de bitrate te sturen:

  • Constante bitrate houdt overal één snelheid aan: statische beelden verspillen bits, snelle beweging valt uiteen. Het past bij verbindingen met een harde bovengrens.
  • Variabele bitrate met een doel middelt uit en laat scènes van elkaar lenen. De omvang is voorspelbaar, dus gebruik dit wanneer de uitvoer binnen een limiet moet passen.
  • Constante kwaliteit, meestal een CRF-waarde, legt de kwaliteit vast en laat de bitrate gaan waar hij nodig is. De omvang is onvoorspelbaar, de kwaliteit gelijkmatig, en het is de standaard voor alles wat bekeken en niet gestreamd wordt.

Voor H.264 loopt de CRF-schaal van 0 tot 51, waarbij lager beter is: 18 is vrijwel niet van de bron te onderscheiden, 23 een verstandige standaard, voorbij 28 valt beweging uiteen. De schaal is niet gedeeld tussen codecs.

Keyframes, en waarom knippen soms gratis is

Een I-frame, of keyframe, is een volledig beeld dat op zichzelf decodeert. Een P-frame slaat alleen op wat er veranderd is ten opzichte van een eerder beeld. Een B-frame voorspelt vanuit zowel een eerder als een later beeld, wat het best comprimeert en de reden is dat decoders beelden soms even vasthouden voor ze getoond worden.

Een keyframe plus alles wat ervan afhangt is een group of pictures, en webencoders plaatsen er ongeveer elke twee seconden een. Knip midden in een groep en de overgebleven frames verwijzen naar een beeld dat niet meer in het bestand zit, en daarom kent knippen twee modi. Streams kopiëren is direct en verliesvrij maar landt alleen op een keyframe, dus het beginpunt kan tot de lengte van een groep verschuiven; opnieuw coderen zet een keyframe waar je erom vroeg, ten koste van tijd en kwaliteit. Trim Video biedt beide; kopieer, tenzij het exacte beeld ertoe doet.

Opnieuw coderen kost kwaliteit omdat elke lossy doorgang weggooit wat het model als minst zichtbaar beschouwt. Codeer nogmaals en de tweede doorgang behandelt de artefacten van de eerste als echt detail, bewaart ze en voegt er eigen artefacten aan toe, waardoor de fout zich over generaties opstapelt. Kopieer de streams wanneer alleen de container verandert, en kopieer het beeld wanneer alleen de audio eruit gaat, wat Mute Video doet. Rotate Video kan een rotatievlag zetten in plaats van pixels te draaien, al tonen spelers die de vlag negeren de oorspronkelijke oriëntatie. Als pixels moeten veranderen, verander dan alles in één doorgang.

Het audiospoor is de andere helft

Audio is een aparte stream met een eigen codec, sample rate en kanaalindeling, en een veelvoorkomende reden waarom een bestand niet afspeelt. Een browser die het H.264-beeld probleemloos decodeert, decodeert misschien geen AC-3 of DTS surround, wat stilte of een harde fout op het hele bestand oplevert. Schijfrips in MKV lopen hier voortdurend op stuk.

De sample rate is hoe vaak de golfvorm gemeten werd: 44100 Hz van cd, 48000 Hz de videostandaard. AAC op 48000 Hz stereo is de veilige keuze voor uitlevering, rond 128 kb/s voor spraak en 192 kb/s voor muziek. Extract Audio haalt een spoor eruit als MP3, WAV, AAC of Opus.

Video omzetten naar een GIF

GIF is een stilstaandbeeldformaat uit 1987 met animatie erop geschroefd en zonder echte bewegingscompensatie. Elk beeld wordt grotendeels op zichzelf gecomprimeerd, dus vijf seconden kan enkele megabytes beslaan waar dezelfde clip als geluidloze MP4 een paar honderd kilobyte is. Het is beperkt tot 256 kleuren per beeld, heeft één bit transparantie, en geen geluid.

De kleurlimiet is waar kwaliteit gewonnen of verloren wordt. Een generiek vast palet geeft banden in kleurverlopen en dwingt zware dithering af, en die ruis lijkt bijna willekeurig, dus hij comprimeert slecht en blaast het bestand op. Een palet uit de clip zelf opbouwen en de beelden daarop afbeelden geeft een beter beeld en vaak een kleiner bestand; Video to GIF doet die extra doorgang. Houd GIF's kort en smal: twee of drie seconden, 480 tot 640 pixels breed, 10 tot 15 beelden per seconde. Als de bestemming video accepteert, stuur dan een MP4 zonder geluid.

Instellingen die werken voor het web

  • H.264 in MP4 met AAC-audio voor alles wat simpelweg moet afspelen.
  • CRF rond 23, omlaag naar 20 voor schermopnames met fijne tekst, omhoog naar 26 voor achtergrondbeelden.
  • Schaal terug naar de breedte waarop het getoond wordt, vóór het comprimeren en niet erna.
  • Zet faststart aan, zodat de index vooraan staat en het afspelen begint voordat het downloaden klaar is.

Alles hier draait in de browser op je eigen machine, dus er wordt niets geüpload en de beperking is geheugen, geen serverquotum. Decodeerbuffers voor een lang 4K-bestand kunnen een tabblad uitputten, dus knip eerst en schaal daarna.