Ik heb videoframes in PNG-indeling met 1 FPS en ik probeer ze met ffmpeg om te zetten in een video.

Als ik zoiets als dit doe:

ffmpeg -i data/input-%4d.png data/output.mp4

krijg ik een video met 25 fps, wat eigenlijk een zeer snel vooruitspoelen van de invoer (die wordt vastgelegd met 1FPS).

Als ik het probeer:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Ik krijg iets dat VLC niet wil afspelen 🙂

Nu, als ik de eerste video (de FF-video) neem en een filter toepas om het te vertragen (bijv. -filter:v "setpts=24.0*PTS"), kan ik het afspelen als een 1 FPS-video, maar de prijs is natuurlijk de bestandsgrootte. Het genereert een hoop herhaalde frames, denk ik.

De vraag is dus hoe maak ik een video met precies 1 FPS en wordt deze daadwerkelijk met die snelheid afgespeeld? Het uitvoerformaat is trouwens niet ” Dat is belangrijk voor mij.

Reacties

  • Ik ‘ ben niet zeker ffmpeg is slim genoeg om de videocodec te achterhalen aan de hand van de bestandsextensie containerformaat, .mp4. Probeer -vcodec libx264 -vpre hq toe te voegen aan de opdrachtregel, om het de codec en coderingsparameters te vertellen.
  • Het kwam er echt goed uit, en zoals gezegd werkte het goed en produceerde alleen rare resultaten toen ik -r 1 toevoegde.
  • Ik denk dat je misschien meer geluk hebt bij een ffmpeg-antwoord op stackoverflow.com of superuser.com .

Antwoord

Als je een one-liner voor FFMPEG wilt die een video genereert die met 1 frame per seconde wordt afgespeeld, moet je framerates specificeren voor zowel invoer als uitvoer, als volgt:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

De -r 1 betekent dat de video wordt afgespeeld met 1 van de originele afbeeldingen per seconde.
De -r 10 betekent dat de video wordt afgespeeld met 10 frames per seconde.

(De -pix_fmt yuv420p is er alleen om compatibiliteit met een breed scala aan afspeelprogrammas te garanderen. Het is hier bijvoorbeeld vereist om de video af te spelen door Windows Media Player.)

Ik heb veel verschillende outputframerates getest en 10 lijkt het laagste aantal te zijn dat je kunt gebruiken en dat nog steeds een video die VLC zal afspelen.

Natuurlijk betekent de bovenstaande opdracht dat elke originele afbeelding wordt vermenigvuldigd, maar het is een eenvoudigere methode dan de “slow it down” -methode die u noemde, en afhankelijk van de codec produceert misschien niet een video die veel groter is dan een echte 1-FPS-video.

Om dit te testen, heb ik zojuist een echte 1-FPS-video gemaakt, die uitkwam op 2,24 kiB. Ik produceerde toen een video met dezelfde invoerbeelden maar uitvoer met 24 FPS, en het kwam uit op 5,76 kiB. Dat is iets meer dan het dubbele van de grootte, en nog lang niet 24 keer zo groot. 🙂

Reacties

  • +1 op -pix_fmt. Gemakkelijk te vergeet dat sommige mensen erop staan om WMP te gebruiken 🙂
  • waarom zou je willen dat het uitvoerformaat 10 fps is terwijl de invoer slechts 1 is? ‘ t it 90% redundante frames maken die precies hetzelfde zijn?
  • @Herbert het creëert redundante frames zodat je de framesnelheid tot 10 kunt krijgen, wat net zo wordt gedaan als VLC niet ‘ klagen niet , en het verandert visueel niet ‘ de video. De encoder is slim genoeg om te zien dat de frames allemaal identiek zijn, dus je ‘ niet eindigen met een veel groter bestand
  • @chiliNUT duidelijk, het keyframe-ding, dat niet alle formaten, maar de meeste gezonde formaten zullen doen. Bedankt !

Antwoord

Gebruik beide -framerate en -r

Om bijvoorbeeld een laatste video te hebben die eruitziet als 1FPS:

ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4 

Dit is vergelijkbaar met wat PNG-frames converteren naar video met 1 FPS | Unix & Linux Stack Exchange zegt, maar ik had -framerate nodig in plaats van -r om het te laten werken.

Dit wordt vermeld op de wiki op: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Het stelt de output-framerate in op 30, wat VLC aankan, en kopieert elke afbeelding 30 keer, zodat de outputvideo op 1 FPS lijkt te zijn. Zie ook: Afspeelproblemen in VLC met video met lage fps van afbeeldingen met ffmpeg | Stack Overflow

VLC kan dan de video normaal afspelen.

Getest op Ubuntu 16.10, VLC 2.2.4, ffmpeg 3.0.5, in een directory met 10 PNGs.

Zie ook: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

Reacties

  • Wat is ‘ is het verschil tussen -r en -framerate?
  • @Royi Ik weet het niet ‘ echt, behalve dat dit het enige is dat voor mij werkte 🙂 Maar als het je gelukt is haal het uit de man paginas, laat het me weten 😉 Een zinvol citaat is ” -r Negeer als invoeroptie alle tijdstempels opgeslagen in het bestand en in plaats daarvan tijdstempels genereren uitgaande van constante framesnelheid fps. Dit is niet hetzelfde als de -framerate-optie die wordt gebruikt voor sommige invoerformaten zoals image2 of v4l2 (het was hetzelfde in oudere versies van FFmpeg). Gebruik bij twijfel -framerate in plaats van de invoeroptie -r. ”

Answer

Wat als u uw tweede voorbeeld enigszins als volgt uitbreidt:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4 

De -r 1 moet vóór de .png-bestanden komen, niet erna.

Van de FFmpeg-documentatie :

Als algemene regel worden opties toegepast op het volgende gespecificeerde bestand. Daarom is volgorde belangrijk en kunt u dezelfde optie meerdere keren op de opdrachtregel hebben. Elke gebeurtenis wordt vervolgens toegepast op het volgende invoer- of uitvoerbestand.

Opmerkingen

  • Helaas is dit werkt niet. De vermelding dat de bestelling belangrijk is heeft me echter veel tijd bespaard. Bedankt.

Antwoord

Dit is een bug in VLC (die nog steeds bestaat in versie 3.0.6). Na wat experimenten realiseerde ik me dat VLC crasht voor videos met een FPS van minder dan 10 . Dus alle videos met 10 FPS of meer zouden geen probleem moeten zijn. Er is dus momenteel geen duidelijke manier om een video met 1 FPS te krijgen die kan worden afgespeeld in VLC ( don “t geef het op, blijf ) lezen.

Een oplossing is -zoals in het antwoord hierboven getoond- om het effect van 1 FPS te vervalsen door de afbeeldingen te dupliceren (wanneer we hebben eigenlijk een FPS gelijk aan 10 of meer, wat ok is voor VLC).

Voorbeeld: als je een map met 12 afbeeldingen hebt en je wilt een video genereren met 1 FPS (die kan worden afgespeeld in VLC), dan moet je elke afbeelding meerdere keren dupliceren (laten we zeggen 10 keer), en dan vertellen FFMPEG om een video van 10 FPS te genereren. Op deze manier krijgen we een video met een totaal aantal frames van 120, waarbij elk beeld gedurende 1 seconde wordt afgespeeld (aangezien het 10 keer wordt gedupliceerd), wat gewoon nep is voor 1 FPS.

Ik geef de voorkeur aan gebruik de fps parameter in plaats van

(die wordt weergegeven in een ander antwoord), wat in sommige gevallen problematisch kan zijn (volgens de officiële documentatie ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv 

Omdat de invoer -framerate lager is dan de uitvoer fps, FFMPEG zal frames dupliceren om de gewenste outputframesnelheid te bereiken (die 10 is volgens het bovenstaande commando).

Het is ook belangrijk om op te merken dat de volgorde van -framerate en -vf fps is belangrijk , aangezien deze configuratie wordt toegepast op de volgende genoemde video (in- of output). Dat is volgens de officiële documenten :

opties worden toegepast op de volgende gespecificeerde het dossier. Daarom is volgorde belangrijk …

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *