Om video's geschikt te maken voor m'n GSM (een Nokia 5800) ben ik de laatste tijd aan het stoeien met ffmpeg. Ik draai volledig onder linux en er zijn wel wat tooltjes te vinden, maar die bieden zelden de mogelijkheden die ik wil of zijn nodeloos ingewikkeld.
Mijn regel om te converteren is vrij eenvoudig:
Hierbij pakt ffmpeg de juiste codecs voor een MP4-container (H.264 en AAC) die in principe probleemloos draaien, zolang het bronbestand maar 16:9 is.
Alleen niet alle bronbestanden zijn 16:9, maar soms ook van het bredere format. Op dat moment gaat het afspelen op m'n gsm fout, want hij rekt het bestand vertikaal op.
Om dit op te lossen is het mogelijk met ffmpeg om padding aan het bestand toe te voegen. Alleen hier gaat het fout door een eigenschap van ffmpeg.
Wanneer padding wordt toegevoegd, wordt het doelbestand namelijk een andere resolutie dan de opgegeven 640x360. Wat ffmpeg namelijk doet is de padding toevoegen aan het bronbestand, voor conversie. Bij het omzetten wordt volgens de afmeting van het bronbestand (zonder padding) weer gebruikt, waardoor het doelbestand uiteindelijk vertikaal groter wordt, omdat boven op de 640x360 de padding wordt toegevoegd. De vertikale resolutie wordt daardoor in een aantal gevallen te hoog voor de Nokia 5800, die daardoor weigerd het bestand af te spelen. Onder een bepaalde grens wordt de video gewoon samengedrukt, wat een normaal en goed beeld opleverd.
Het is zo een beetje lastig uit te leggen, ik zal vanavond eens de resoluties van doel- en bronbestand plaatsen met en zonder padding.
Maar, hoe kan ik zorgen dat ffmpeg een bestand met een andere aspect-ratio dan 16:9 toch goed omzet met eventuele padding, zodat het doelbestand in resolutie een aspect-ratio van 16:9 krijg (bij voorkeur 640x360) met extra zwarte balken?
Op internet zijn er talloze tips te vinden voor het converteren, maar die zijn allemaal vaak erg ingewikkeld met onnodige opties voor de video- en audio-codecs (die dus niks aan de beeldverhouding veranderen).
Edit:
Wat ik was vergeten te melden, was dat het geconverteerde bestand met én zonder padding beiden in video-spelers als VLC gewoon afspelen op de goede verhouding. De Nokia lijkt dus sowieso de ingestelde aspect-ratio te negeren en standaard de video full-screen af te spelen.
Even een kleine casus:
Bronbestand: 1280x544
Doelbestand: 640x360 (zonder padding optie, speelt af op de Nokia, maar wordt vertikaal uitgerekt)
Doelbestand: 640x536 (met 88 pixels padding boven en onder op het origineel, speelt niet af op de Nokia)
Wat ik dus zoek is een mogelijkheid om het bronbestand met een verhouding 1:2,35 om te kunnen zetten in een doelbestand van 640x360 waarbij het hoogte verschil met een verhouding van 16:9 wordt opgevuld met zwarte balken.
Edit 2:
Blijkbaar klopte de gevonden documentatie niet... Inmiddels heb ik een test gedaan waarbij het bronbestand geconverteerd is naar een doelbestand met de resolutie van 640x272 met 44 pixels padding boven en onder. Daarmee heeft het doelbestand een resolutie van 640x360 gekregen en dit wordt zonder problemen afgespeeld, inc. de zwarte balkjes boven en onder.
Mijn regel om te converteren is vrij eenvoudig:
code:
1
| ffmpeg -i {bron bestand} -ab 128k -ac 2 -qscale 5 -s 640x360 -aspect 16:9 {doelbestand}.mp4 |
Hierbij pakt ffmpeg de juiste codecs voor een MP4-container (H.264 en AAC) die in principe probleemloos draaien, zolang het bronbestand maar 16:9 is.
Alleen niet alle bronbestanden zijn 16:9, maar soms ook van het bredere format. Op dat moment gaat het afspelen op m'n gsm fout, want hij rekt het bestand vertikaal op.
Om dit op te lossen is het mogelijk met ffmpeg om padding aan het bestand toe te voegen. Alleen hier gaat het fout door een eigenschap van ffmpeg.
Wanneer padding wordt toegevoegd, wordt het doelbestand namelijk een andere resolutie dan de opgegeven 640x360. Wat ffmpeg namelijk doet is de padding toevoegen aan het bronbestand, voor conversie. Bij het omzetten wordt volgens de afmeting van het bronbestand (zonder padding) weer gebruikt, waardoor het doelbestand uiteindelijk vertikaal groter wordt, omdat boven op de 640x360 de padding wordt toegevoegd. De vertikale resolutie wordt daardoor in een aantal gevallen te hoog voor de Nokia 5800, die daardoor weigerd het bestand af te spelen. Onder een bepaalde grens wordt de video gewoon samengedrukt, wat een normaal en goed beeld opleverd.
Het is zo een beetje lastig uit te leggen, ik zal vanavond eens de resoluties van doel- en bronbestand plaatsen met en zonder padding.
Maar, hoe kan ik zorgen dat ffmpeg een bestand met een andere aspect-ratio dan 16:9 toch goed omzet met eventuele padding, zodat het doelbestand in resolutie een aspect-ratio van 16:9 krijg (bij voorkeur 640x360) met extra zwarte balken?
Op internet zijn er talloze tips te vinden voor het converteren, maar die zijn allemaal vaak erg ingewikkeld met onnodige opties voor de video- en audio-codecs (die dus niks aan de beeldverhouding veranderen).
Edit:
Wat ik was vergeten te melden, was dat het geconverteerde bestand met én zonder padding beiden in video-spelers als VLC gewoon afspelen op de goede verhouding. De Nokia lijkt dus sowieso de ingestelde aspect-ratio te negeren en standaard de video full-screen af te spelen.
Even een kleine casus:
Bronbestand: 1280x544
Doelbestand: 640x360 (zonder padding optie, speelt af op de Nokia, maar wordt vertikaal uitgerekt)
Doelbestand: 640x536 (met 88 pixels padding boven en onder op het origineel, speelt niet af op de Nokia)
Wat ik dus zoek is een mogelijkheid om het bronbestand met een verhouding 1:2,35 om te kunnen zetten in een doelbestand van 640x360 waarbij het hoogte verschil met een verhouding van 16:9 wordt opgevuld met zwarte balken.
Edit 2:
Blijkbaar klopte de gevonden documentatie niet... Inmiddels heb ik een test gedaan waarbij het bronbestand geconverteerd is naar een doelbestand met de resolutie van 640x272 met 44 pixels padding boven en onder. Daarmee heeft het doelbestand een resolutie van 640x360 gekregen en dit wordt zonder problemen afgespeeld, inc. de zwarte balkjes boven en onder.
[ Voor 21% gewijzigd door deepbass909 op 09-12-2009 19:39 ]
Waarschuwing, opperprutser aan het werk... en als je een opmerking van mij niet snapt, klik dan hier