Creazione di video con audio e fermo immagine per YouTube


23

Sto eseguendo il seguente comando:

ffmpeg -i audio.mp3 -ar 44100 -f image2 -i logo.jpg -r 15 -b 1800 -s 640x480 foo.mov

Che produce correttamente un video con il mio audio registrato e un'immagine su di esso.

Quando provo a caricarlo su YouTube, non riesce a elaborare, indipendentemente dai formati che provo: .mov, .avi, .flv, .mp4

C'è qualche impostazione che mi manca in quanto sopra che genererebbe un formato accettato da Youtube? Ho provato a sfogliare la documentazione di ffmpeg ma sono sopra di me.

Ho fatto un esperimento inserendo un video di 2 secondi con un mp3 di 30 secondi. Quando l'ho caricato su YouTube, il video risultante era lungo solo 2 secondi. Quindi può darsi che YouTube guardi solo alla traccia video per la lunghezza, e dal momento che una foto è solo una cornice lunga o qualsiasi altra cosa, forse che la blocca.

Risposte:


13

Ecco cosa ha funzionato:

ffmpeg -i audio.mp3 -f image2 -loop 1 -i logo.jpg 
-r 15 -s 640x480 \
-c:v libx264 -crf 18 -tune stillimage -preset medium \
-shortest foo.mov

In particolare, l' loopopzione, che duplicherà l'immagine come cornici. Avrà inoltre bisogno shortestdell'opzione per evitare che il file cresca e cresca (in questo modo lo tronca alla lunghezza del flusso più breve - qui, il file audio).

L' ropzione modifica la frequenza dei fotogrammi e crf 18imposta la qualità (utilizzare qui un valore più elevato per una qualità video inferiore). Vedi qui per maggiori dettagli: FFmpeg: l'ultimo strumento di manipolazione di video e audio


2
Non funziona per me. Ho un film a un fotogramma.
Pavel Vlasov,

Lavoro per me adesso.
molnarg,

4

Un pezzo di codice che funziona per me, da un altro forum:

ffmpeg -loop 1 -r ntsc -i image.jpg -i song.mp3 -c:a copy -c:v libx264 -preset fast -threads 0 -shortest output.mkv 

2

Ho preso il codice di Pavel, che ha funzionato anche per me, e l'ho abbreviato tagliando opzioni inutili:

ffmpeg -loop 1 -shortest -i <audio file> -i <image file> <output video file>

questo è un modulo generale che funziona con qualsiasi immagine e file audio come input e produce un file video come output.

Detto questo, poiché il tuo streaming video sarà composto da una singola immagine ripetuta indefinitamente, potresti impostare un frame rate basso (cioè il numero di immagini che appare in un secondo) con -r. Si noti che non tutti i contenitori di output consentono frame rate bassi. Uno che fa è avi, quindi potresti fare:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> output.avi

questo creerebbe un file video con una frequenza fotogrammi di 0,1 (ovvero un'immagine ogni 10 secondi) invece del valore predefinito di 25. Ciò influirà sulla dimensione del file ma non sulla qualità del video. Alla fine, puoi impostare il bitrate audio per ottenere una migliore qualità audio con -ab. Questo è il comando che effettivamente uso per realizzare questo tipo di video per YouTube:

ffmpeg -loop 1 -shortest -r 0.1 -i <audio file> -i <image file> -ab 128k output.avi

Grazie. Ho corso ffmpeg -loop 1 -shortest -r 0.1 -i audio.mp3 -i image.jpg output.avima ho ottenuto "Opzione loop non trovato." Qualche idea?
Colonnello Panic,

@col Se sei ancora interessato: hai bisogno dell'opzione loop prima dell'ingresso dell'immagine, non prima dell'audio.
slhck,

questo è ciò che ha funzionato per me:ffmpeg -i <audio file> -loop 1 -i <image file> -shortest <output video file>
Karolinger

2

con avconv:

avconv -i input.mp3 -loop 1 -f image2 -i logo.png -r 30 -s 640x480 -ab 128k -ar 44100 -ac 1 -ss 00:00:00.000 -t 01:02:03.123 foo.ogv

Benvenuto in SuperUser e grazie per la tua risposta. Qualche dettaglio in più su ciò che stai proponendo e perché sarebbe utile.
Brad Patton,

1
la risposta è perché ffmpeg è deprecato
ZiTAL

2
Nessun progetto ffmpeg è in corso. C'è stata una disputa che ha portato al messaggio deprecato. Vedi stackoverflow.com/questions/9477115/…
Brad Patton

2
Utilizzare le -shortestopzioni di output anziché dichiarare manualmente i tempi (inoltre, utilizzare ffmpeganziché avconvse possibile).
Llogan,

2
Realizzato uno script bash nel caso qualcuno fosse interessato
Dallaylaen,

0

Ho ottenuto che funzioni dopo molte sperimentazioni: https://www.youtube.com/watch?v=qjlDT819Q3s

  1. Converti immagine / i in video secondo https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images :

    ffmpeg -framerate 1/20 -i png/img-%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" png.mp4

    Qui uso diverse immagini e le faccio cambiare ogni 20 anni.

  2. Concatena abbastanza copie del video sopra per coprire la durata del tuo audio come da https://trac.ffmpeg.org/wiki/Concatenate . Altre soluzioni, come aspettarsi ffmpeg -i wav.wav -i png.mp4 youtube.mp4di fare la cosa giusta, sono state respinte da YouTube (inoltre, giocatori come VLC sono confusi e non possono cercare correttamente). La mia ipotesi è che le posizioni temporali debbano essere adattate nelle copie, il che ffmpegnon funziona, a meno che non siano concatenate:

    ffmpeg -f concat -i pngs.txt -c copy pngs.mp4

    (dove il file pngs.txtè fatto a mano per contenere tutte le copie necessarie: copie = lunghezza audio / lunghezza video)

  3. Mescola il tuo audio con il video ottenuto in 2 come da https://www.virag.si/2015/06/encoding-videos-for-youtube-with-ffmpeg/ :

    ffmpeg -i pngs.mp4 -i wav.wav -shortest -codec:v libx264 -crf 21 -bf 2 -flags +cgop -pix_fmt yuv420p -codec:a aac -strict -2 -b:a 384k -r:a 48000 -movflags faststart youtube.mp4

Ora il file youtube.mp4dovrebbe essere accettato da YT.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.