Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
  Condividi: Facebook Twitter
[Risolto] FFMPEG-come trasformare foto in video con immagini orientate correttamente?
#1
Salve a tutti.
In una cartella, ho delle immagini chiamate prefisso_numero.jpg dove prefisso_ è una stringa alfanumerica, e numero è un numero di 6 cifre; preciso che prefisso_ è sempre uguale, mentre numero è un numero di 6 cifre progressivo (cioè aumenta di una unità per ogni immagine).

Se in quella cartella apro un terminale ed impartisco il comando


Codice:
ffmpeg -f image2 -r 1/3 -i prefisso_%06d.jpg video3secFoto1.flv # Unisce le sole immagini presenti nella cartella da cui il comando è stato lanciato: aventi estensione .jpg il cui nome si ottiene anteponendo prefisso_ ad una sequenza numerica di 6 numeri consecutivi, in un unico video formato .flv della durata di 3 secondi per ciascuna foto

ottengo il file multimediale video3secFoto1.flv composto dall'unione delle immagini contenute nella cartella dove ogni immagine diventa uno spezzone di video di 3 secondi.

Il problema è che il video così ottenuto mostra le foto tutte orizzontali, anche se molte sono verticali.
Quale istruzione devo impartire per far sì che le foto verticali appaiano verticali anche nel video finale?

Saluto tutti e ringrazio sin d'ora chi mi aiuterà.

---
edit
---
Posto l'output di un paio di foto, nell'eventualità che possa essere utile...
Codice:
$ file prefisso_000001.jpg # Questa immagine è verticale
prefisso_000001.jpg: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=12, height=4312, manufacturer=samsung, model=SM-A405FN, orientation=upper-right, xresolution=212, yresolution=220, resolutionunit=2, software=A405FNXXU3BTD4, datetime=2021:01:23 15:37:16, width=5760], baseline, precision 8, 5760x4312, components 3
$ file prefisso_000002.jpg # Questa immagine è orizzontale
prefisso_000002.jpg: JPEG image data, Exif standard: [TIFF image data, little-endian, direntries=12, height=4312, manufacturer=samsung, model=SM-A405FN, orientation=upper-left, xresolution=212, yresolution=220, resolutionunit=2, software=A405FNXXU3BTD4, datetime=2021:01:23 17:30:40, width=5760], baseline, precision 8, 5760x4312, components 3
$
Cita messaggio
#2
Ciao Sargon6,

non conosco ffmpeg ma quello che si vede dai dati delle tue foto e' che hanno lo stesso aspect ratio: 5760x4312.

Probabilmente ffmpeg non riconosce il tag di orientamento.

Prova con un programma di manipolazione foto tipo GIMP a ruotare e salvare la foto verticale con un rapporto 4312x5760
Cita messaggio
#3
(06/01/2022, 21:30)Septem Ha scritto: Ciao Sargon6,

non conosco ffmpeg ma quello che si vede dai dati delle tue foto e' che hanno lo stesso aspect ratio: 5760x4312.

Probabilmente ffmpeg non riconosce il tag di orientamento.

Prova con un programma di manipolazione foto tipo GIMP a ruotare e salvare la foto verticale con un rapporto 4312x5760
Per la rotazione ok, ma probabilmente inserendo una foto in verticale ffmpeg adotterà quell'altezza per tutto il filmato, facendo comparire delle bande nere sopra e sotto alle foto orizzontali.
Cita messaggio
#4
Saluto entrambi e ringrazio per l'interessamento.
A parte il fatto che stiamo parlando di centinaia di foto, quindi ci metterei tantissimo tempo per modificarle una ad una, girandole una ad una con GIMP non otterrei nulla di diverso di quanto otterrei più rapidamente se apro un terminale nella cartella in cui ho salvato le foto e poi impartisco il comando
Codice:
exiftran -ai *.jpg # Ruota le immagini secondo quanto riportato nei dati exif
ed io ho verificato che il comando
Codice:
ffmpeg -f image2 -r 1/3 -i prefisso_%06d.jpg video3secFoto1.flv # Unisce le sole immagini presenti nella cartella da cui il comando è stato lanciato: aventi estensione .jpg il cui nome si ottiene anteponendo prefisso_ ad una sequenza numerica di 6 numeri consecutivi, in un unico video formato .flv della durata di 3 secondi per ciascuna foto
crea un video delle medesime dimensioni della prima immagine processata, quindi: SE la prima immagine processata è orizzontale, TUTTE le immagini successive diverranno orizzontali; di conseguenza

- SE in una cartella ci sono solo foto orizzontali a prescindere dal contenuto dei relativi dati EXIF, il comando FFMPEG da me utilizzato per creare video produce un video di sole immagini orizzontali, e le immagini verticali vengono RUOTATE

- SE in una cartella ci sono sia foto orizzontali sia foto verticali come indicato nei relativi dati EXIF, E la prima foto è orizzontale, il comando FFMPEG da me utilizzato per creare video produce un video di sole immagini orizzontali, e le immagini verticali vengono ALLARGATE.

La cosa è un po' complicata da spiegare, ma basta mettere in pratica i 2 comandi summenzionati con 4 foto per vedere ciò che sto tentando di descrivere...
Cita messaggio
#5
Prova a guardare qui.
Non so se e' quello che ti serve ma sembra che con l'opzione -filter si risolva il problema dell' aspect ratio per non "stiracchiare" le foto in verticale:

Nel tuo caso dovrebbe essere:
Codice:
ffmpeg -f image2 -r 1/3 -i pic_%06d.jpg -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" video3secFoto1.flv
Cita messaggio
#6
Grazie Septem, L'istruzione da te suggerita, risolve Tantissimi problemi, ma non quello della rotazione delle immagini, ma unendo i tuoi suggerimenti a quello he già sapevo, ho risolto il mio problema!
Riassumo la soluzione.


1) Ruotare correttamente le immagini aventi estensione .jpg contenute in una cartella nota; per farlo, è sufficiente aprire un terminale nella cartella in cui si trovano le immagini ed impartire il comando
Codice:
exiftran -ai *.jpg # Ruota le immagini secondo quanto riportato nei dati exif


2) Accertarsi che le immagini abbiano tutte la medesima estensione, che per tutte il nome sia composto dal medesimo prefisso più un suffisso formato da un numero di (nel mio caso) 6 cifre consecutive; per farlo, è sufficiente aprire un terminale nella cartella in cui si trovano le immagini ed impartire il comando:
Codice:
rename 's/.+/our $i; sprintf("prefisso_%06d.jpg", 1+$i++)/e' *.jpg


3) Solo ora, per ottenere un video formato .flv con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto, impartire il comando:
Codice:
ffmpeg -f image2 -r 1/3 -i prefisso_%06d.jpg -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" video3secFoto1.flv # Unisce le immagini aventi estensione .jpg il cui nome si ottiene anteponendo prefisso_ ad una sequenza numerica di 6 numeri consecutivi, in un unico video formato .flv con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto

ed il gioco è fatto.

4) Se si desidera ottenere il file video in un formato diverso (per esempio: .mp4), dobbiamo impostare di conseguenza l'estensione del file di output, ed il comando diventa:
Codice:
ffmpeg -f image2 -r 1/3 -i prefisso_%06d.jpg -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" video3secFoto1.mp4 # Unisce le immagini aventi estensione .jpg il cui nome si ottiene anteponendo prefisso_ ad una sequenza numerica di 6 numeri consecutivi, in un unico video formato .mp4 con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto
Cita messaggio
#7
---
edit
---
Aggiungo le istruzioni per uno script che, se messo nella medesima cartella in cui si trovano le immagini .jpg da convertire in video, basta modificare "la parte fra apici" della riga
Codice:
label:"Unica riga \n...\nUltima riga" prefisso_000000.jpg # Crea immagine 1280x720 in formato .jpg visualizzante un messaggio scritto al centro
salvare lo script così ottenuto ed avviarlo, e lo script farà quello che serve.
Codice:
#!/bin/bash
# ISTRUZIONI per unire più immagini in un video con risoluzione 1280:720 (HD Ready).
# by SARGONSEI Massimo
# a) Creare un'apposita cartella di lavoro, e copiarvi tutte le immagini .jpg dalle quali si vuole ottenere il video, e solo quelle.
# b) Creare, nella medesima cartella di lavoro, un documento di testo contenente tutte  queste istruzioni, e renderlo avviabile.
# c) Avviare lo script così ottenuto.
# d) Qualora si desideri impartire le istruzioni una ad una, aprire un terminale nella medesima cartella in cui abbiamo già copiato tutte le immagini .jpg dalle quali si vuole ottenere il video, ed impartiamo una ad una (oppure facciamo copia-incolla) le sole 6 righe sottostanti che iniziano con uno spazio vuoto, nel medesimo ordine in cui sono riportate qui sotto (per una corretta esecuzione, è sufficiente digitare i caratteri qui collocati fra il carattere [spazio vuoto] e il carattere #).
#
# 1) Ruota le immagini secondo quanto riportato nei dati exif
#
exiftran -ai *.jpg # Ruota le immagini secondo quanto riportato nei dati exif

# 2) Rinomina tutti i files aventi estensione .jpg dando loro un nome che comincia con "prefisso_" e termina con un numero di 6 cifre consecutivo.
#
rename 's/.+/our $i; sprintf("prefisso_%06d.jpg", 1+$i++)/e' *.jpg # Rinomina tutti i files aventi estensione .jpg dando loro un nome che comincia con "prefisso_" e termina con un numero di 6 cifre consecutivo.

# 3) Crea un'immagine 1280x720 in formato .jpg visualizzante un messaggio scritto al centro
# -background [colore dello sfondo]
# -fill [colore del messaggio scritto]
# -font [font di caratteri utilizzato per scrivere il messaggio]
# -size [Larghezza x Altezza immagine]
# -pointsize [dimensioni dei caratteri]
# -gravity [posiziona il messaggio al centro dell'immagine]
# label: "[testo del messaggio contenuto nell'immagine]"
# prefisso_000000.jpg = nome dell' immagine creata
#
convert -background green -fill red  -font verdana -size 1280x720  -pointsize 100  -gravity center label:"Unica riga \n...\nUltima riga" prefisso_000000.jpg # Crea immagine 1280x720 in formato .jpg visualizzante un messaggio scritto al centro

# 4) Crea un video formato .flv con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto.
#
ffmpeg -f image2 -r 1/3 -i prefisso_%06d.jpg -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" video3secFoto1.flv # Unisce le immagini aventi estensione .jpg il cui nome si ottiene anteponendo prefisso_ ad una sequenza numerica di 6 numeri consecutivi, in un unico video formato .flv con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto

# 5) Se si desidera convertire il file video in un formato diverso (per esempio: .mp4), aprire un terminale ed impartire il comando
#
ffmpeg -i video3secFoto1.flv -q:a 0 -q:v 0 video3secFoto1.mp4 # Converte il video in formato 'flv' in un video in formato 'mp4' mantenendo inalterata la qualità dell'audio e del video.

# 6) Crea un video formato .mp4 con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto
#
ffmpeg -f image2 -r 1/3 -i prefisso_%06d.jpg -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" video3secFoto2.mp4 # Unisce le immagini aventi estensione .jpg il cui nome si ottiene anteponendo prefisso_ ad una sequenza numerica di 6 numeri consecutivi, in un unico video formato .mp4 con risoluzione 1280:720 (HD Ready) della durata di 3 secondi per ciascuna foto

# https://legacy.imagemagick.org/Usage/text/
Cita messaggio


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)