Am cadre video în format PNG la 1 FPS și încerc să le convertesc într-un videoclip folosind ffmpeg.

Dacă fac așa ceva:

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

Primesc un videoclip la 25 FPS, care este în esență un foarte rapid înainte de intrare (care este capturat la 1FPS).

Dacă încerc:

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

Am ceva ce VLC nu vrea să joace 🙂

Acum, dacă iau primul videoclip (cel FF) și aplic un filtru pentru al încetini (de ex. -filter:v "setpts=24.0*PTS"), îl pot reda ca un videoclip de 1 FPS, dar, desigur, prețul este dimensiunea fișierului. Cred că generează o grămadă de cadre repetate.

Deci, întrebarea este cum creez un videoclip care are exact 1 FPS și se redă de fapt la viteza respectivă? Formatul de ieșire, btw, nu este ” Este atât de important pentru mine.

Comentarii

  • Nu ‘ nu sunt sigur ffmpeg este suficient de inteligent pentru a afla codecul video doar din extensia de fișier format format container, .mp4. Încercați să adăugați -vcodec libx264 -vpre hq la linia de comandă, pentru a-i spune codecul și parametrii de codificare.
  • De fapt, a descoperit că este ok și, așa cum am menționat, a funcționat bine și am produs rezultate ciudate doar când am adăugat -r 1.
  • Cred că s-ar putea să ai noroc mai bun la un răspuns ffmpeg pe stackoverflow.com sau superuser.com .

Răspuns

Dacă doriți un one-liner pentru FFMPEG care generează un videoclip care se redă la 1 cadru pe secundă, ceea ce doriți să faceți este să specificați cadrele atât pentru intrare, cât și pentru ieșire, astfel:

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

-r 1 înseamnă că videoclipul va fi redat la 1 dintre imaginile originale pe secundă.
-r 10 înseamnă că videoclipul va fi redat cu 10 cadre pe secundă.

(-pix_fmt yuv420p este doar acolo pentru a asigura compatibilitatea cu o gamă largă de programe de redare. Aici este necesar, de exemplu, ca videoclipul să poată fi redat de Windows Media Player.)

Am testat mai multe cadre de ieșire diferite, iar 10 pare a fi cel mai mic număr pe care îl puteți utiliza, care va produce în continuare un video pe care VLC îl va reda.

Desigur, comanda de mai sus înseamnă că fiecare imagine originală este înmulțită, dar este o metodă mai simplă decât cea de „încetinire” pe care ați menționat-o și în funcție de codec s-ar putea să nu producă un videoclip mult mai mare decât un adevărat videoclip 1-FPS.

Pentru a testa acest lucru, tocmai am produs un videoclip adevărat 1-FPS, care a ajuns la 2,24 kiB. Apoi am produs un videoclip cu aceleași imagini de intrare, dar la ieșire la 24 FPS, și a ieșit la 5,76 kiB. Acest lucru este aproape dublu față de dimensiune și de aproape 24 de ori mai mare decât dimensiunea. 🙂

Comentarii

  • +1 pe -pix_fmt. uitați că unii oameni insistă să folosească WMP 🙂
  • de ce ați dori ca formatul de ieșire să fie de 10 fps în timp ce intrarea este doar 1? Nu l-ați ‘ creați 90% cadre redundante care sunt exact aceleași?
  • @Herbert creează cadre redundante, astfel încât să puteți obține rata de cadre până la 10, ceea ce se face doar pentru ca VLC să nu nu se plânge și nu vizualizează ‘ vizual. Nu codificatorul este suficient de inteligent pentru a vedea că cadrele sunt identice, astfel încât ‘ nu ajungeți să aveți un fișier mult mai mare
  • @chiliNUT este clar, ceea ce face cadru-cheie, ceea ce nu vor fi toate formatele, dar majoritatea formatelor sănătoase. Mulțumesc !

Răspuns

Utilizați ambele -framerate și -r

De exemplu, pentru a avea un videoclip final care să arate ca 1FPS:

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

Acest lucru este similar cu ceea ce Conversia cadrelor PNG în video la 1 FPS | Unix & Linux Stack Exchange spune, dar aveam nevoie de -framerate în loc de -r pentru ca acesta să funcționeze.

Acest lucru este menționat pe wiki la: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Setează frecvența de ieșire la 30, pe care VLC o poate gestiona, și copiază fiecare imagine de 30 de ori, astfel încât videoclipul de ieșire să pară la 1 FPS. A se vedea, de asemenea: Probleme de redare în VLC cu videoclipuri cu fps redus din imagini folosind ffmpeg | Stack Overflow

VLC este capabil să redea videoclipul normal.

Testat pe Ubuntu 16.10, VLC 2.2.4, ffmpeg 3.0.5, într-un director cu 10 PNG-uri.

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

Comentarii

  • Care este ‘ diferența dintre -r și -framerate?
  • @Royi Nu știu cu adevărat ‘, cu excepția faptului că este singurul lucru care a funcționat pentru mine 🙂 Dar dacă ai reușit să extrageți-l din paginile man, anunțați-mă 😉 Un citat semnificativ este ” -r Ca opțiune de introducere, ignorați orice timestamp-urile stocate în fișier și, în schimb, generează timestamp-uri, presupunând o rată de cadru constantă fps. Acest lucru nu este același cu opțiunea -framerate utilizată pentru unele formate de intrare, cum ar fi image2 sau v4l2 (a fost la fel în versiunile mai vechi ale FFmpeg). Dacă aveți dubii, utilizați -framerate în loc de opțiunea de intrare -r. ”

Răspuns

Ce se întâmplă dacă mărești ușor al doilea exemplu după cum urmează:

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

-r 1 trebuie să apară înainte de fișierele .png, nu după.

Din documentația FFmpeg :

Ca regulă generală, opțiunile sunt aplicate următorului fișier specificat. Prin urmare, ordinea este importantă și puteți avea aceeași opțiune pe linia de comandă de mai multe ori. Fiecare apariție este apoi aplicată următorului fișier de intrare sau de ieșire.

Comentarii

  • Din păcate, acest lucru nu funcționează. Cu toate acestea, menționând că comanda este importantă mi-am economisit mult timp. Mulțumesc.

Răspuns

Acesta este un bug în VLC (care există încă în versiunea 3.0.6). După câteva experimente mi-am dat seama că VLC se blochează pentru videoclipurile cu FPS mai mici de 10 . Deci, toate videoclipurile cu 10 FPS sau mai mult nu ar trebui să fie o problemă. Deci, în prezent, nu există o modalitate curată de a obține un videoclip cu 1 FPS care poate fi redat în VLC ( don „t renunță, continuă să citești ).

O soluție este – așa cum se arată în răspunsul de mai sus – pentru a falsifica efectul 1 FPS prin duplicarea imaginilor (când avem de fapt un FPS egal cu 10 sau mai mult, ceea ce este ok pentru VLC).

Exemplu: dacă aveți un folder cu 12 imagini și doriți să generați un videoclip cu 1 FPS (care poate fi redat în VLC), atunci trebuie să duplicați fiecare imagine de mai multe ori (să spunem de 10 ori) și apoi spuneți FFMPEG generează un videoclip de 10 FPS. În acest fel vom obține un videoclip cu un total de cadre de 120, unde fiecare imagine va fi redată timp de 1 secundă (deoarece este duplicată de 10 ori), ceea ce este pur și simplu un fals pentru 1 FPS.

Prefer să să folosesc parametrul fps decât

(care este prezentat într-un alt răspuns), care poate fi, într-un anumit caz, problematic (conform documentație oficială ).

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

Deoarece intrarea -framerate este mai mică decât ieșirea fps, FFMPEG va duplica cadre pentru a atinge rata de ieșire dorită (care este 10 conform comenzii de mai sus).

De asemenea, este important să observăm ordinea -framerate și -vf fps este important , deoarece această configurație va fi aplicată următorului videoclip menționat (în sau în ieșire). Aceasta este în conformitate cu documente oficiale :

opțiunile sunt aplicate următoarei specificații fişier. Prin urmare, ordinea este importantă …

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *