image + audio = mp4: come ridurre le dimensioni del video?


12

Sto usando ffmpeg per aggiungere un JPG a un MP4 per creare un MP4.

Dato che c'è solo una immagine per rendere il video mi chiedo se c'è un modo per ridurre le dimensioni del video?

Comando:

$ ffmpeg -loop 1 -i image.jpg -i audio.mp3 -shortest -c:a copy output.mp4

risultati:

  • image.jpg = 26,7 K (immagine non così chiara)
  • audio.mp3 = 64,6 M (54 minuti)
  • output.mp4 = 80,6 M (il risultato del video non è così chiaro, la musica è ancora buona)

È una dimensione ragionevole per MP4?


Mi chiedo se è possibile meta mp4 in modo che riproduca solo mp3 e mantenga lo schermo fisso su un jpg per risparmiare dimensioni :)
SIDU

Qual è il player, dispositivo o sito target per l'output?
Llogan,

Sto cercando di caricare .mp4 su Youtube.com
SIDU il

Risposte:


18

Per il caricamento su YouTube

H.264: file più piccoli

Questo metodo utilizza libx264 per codificare video H.264. È più lento del metodo di copia dello stream di seguito, ma potenzialmente genererà file di dimensioni inferiori.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 \
-c:v libx264 -preset veryslow -crf 0 -c:a copy -shortest output.mkv

Stream stream: processo più veloce

Questo metodo esegue semplicemente lo streaming delle copie (nessuna codifica) dell'immagine nel contenitore MKV. È super veloce, ma se la dimensione è importante rispetto al metodo sopra potrebbe produrre un file più piccolo.

ffmpeg -loop 1 -framerate 1 -i image.jpg -i music.mp3 -c copy -shortest output.mkv
  • YouTube accetta praticamente qualsiasi cosa, quindi questi comandi usano alcuni trucchi per rendere la codifica più veloce o ridurre le dimensioni del file e per mantenere alta la qualità perché YouTube ricodificherà qualunque cosa tu gli dia. Al tuo giocatore probabilmente non piacerà, ma YouTube lo farà.

  • In questi esempi viene utilizzata una frequenza dei fotogrammi molto bassa che dovrebbe essere elaborata più velocemente rispetto al valore predefinito di 25 fps.


Massima compatibilità per qualsiasi giocatore

ffmpeg -loop 1 -i image.png -i music.mp3 -vf "scale='min(1280,iw)':-2,format=yuv420p" \
-c:v libx264 -preset medium -profile:v main -c:a aac -shortest -movflags +faststart output.mp4
  • Questo dovrebbe funzionare praticamente su qualsiasi cosa tranne che su dispositivi molto antichi (cambiare -profile:v mainin -profile:v baselinequesto caso).

  • Se l'ingresso audio è già AAC, passare -c:a aaca -c:a copyper evitare la ricodifica non necessaria.

  • Il tempo di codifica sarà più lungo e le dimensioni del file saranno maggiori dei comandi YouTube sopra.

  • Vedi FFmpeg Wiki: H.264 per maggiori informazioni.


Potresti fornire una riga di codice per creare a.jpg + a.mp3 = a.mp4 in 1280 * 720 con frame / sec più bassi consentiti da youtube? Inoltre, poiché esiste un solo lavoro, devo eliminare "-loop 1"? Grazie in anticipo.
SIDU,

@SIDU Il comando esistente fa quello che richiedi (oltre a fornire MKV invece di MP4), ma non so che sia il frame rate più basso supportato da YouTube. Devi solo sperimentare. Perché hai bisogno di MP4 quando stai caricando su YouTube?
Llogan

L'ho provato ma dice:Unrecognized option 'preset'. Error splitting the argument list: Option not found
NineCattoRules

@NineCattoRules Difficile a dirsi senza ulteriori informazioni. Utilizzare un sito pastebin per mostrare il ffmpegcomando completo e l'output completo della console dal comando, quindi fornire il collegamento in un commento.
Llogan

Grazie, ho reinstallato FFMPEG usando il repository mc3man e ora funziona bene!
NineCattoRules

3

Con solo le informazioni che hai fornito a questo, mi viene in mente.

Andiamo a pezzi:

Poiché è stata aggiunta una sola immagine al video. Mi chiedo se esiste un modo per ridurre le dimensioni del video, ad esempio forzare bit rate / secondo = 1 anziché 28?

Poiché è un'immagine fissa, non è necessario cambiare. stai fermo.

Quello di cui stai parlando è frame al secondo (fps) non bitrate. E hai ragione nel concetto. Beign solo un fermo immagine 1 fps non sarebbe un problema.

È una dimensione ragionevole per mp4? Le dimensioni dell'immagine contano molto?

In questo caso la dimensione dell'immagine non avrebbe un peso significativo perché abbiamo a che fare solo con un'immagine fissa. Se fosse un video di alta qualità, allora è un problema diverso.

Dovrei ridimensionare jpg a 1080 * 720 e configurare ulteriori impostazioni in ffmpeg per l'output come 720p (qual è l'impostazione ffmpeg quindi :)?

La risoluzione che stai dicendo è 1280x720.

Non vedo il punto -loop 1nell'opzione qui, rallenterà solo il processo. Hai usato -shortestperché il file ha più di 1 flusso di input? Se no, non c'è motivo di usarlo. Dal momento che hai usato -acodec copydovrò presumere che non vuoi ricodificarlo.

Per un'uscita di 720p 1fps senza ricodifica e bitrate non toccante:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 output.mp4

Si noti che ha più di un flusso di input e si desidera che ffmpeg termini la codifica nel flusso più breve, quindi:

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -s 1280x720 -shortest output.mp4

Ora se devi cambiare il bitrate (diciamo 1024k come esempio);

ffmpeg -framerate 1 -i input.mp3 -i cover.jpg -c:a copy -b:v 1024k -bufsize 1024k -s 1280x720 output.mp4

Vedi: Limita il bitrate di uscita

-c: a copy = Copia il flusso audio in ingresso in modo da non ricodificare.

-b: v = La velocità in bit specificata per essere (non precisamente) costante.

-bufsize = È l'intervallo in cui calcola il bitrate medio. Significa l'immagine con la più bassa perdita di qualità ma bitrate più accurati secondo la specifica in -b: v .

-s = La dimensione effettiva dell'uscita video.

-framerate = La frequenza dei fotogrammi di input che vogliamo che venga utilizzata dall'output.

Tieni presente che se vuoi comunque un video di dimensioni inferiori ad un certo punto dovrai sacrificare la qualità per raggiungere questo obiettivo. E altri modi per farlo prevedono la ricodifica con compressione con perdita.

Da quello che dici, le informazioni che fornisci e quello che stai cercando di fare, penso che il tuo obiettivo sia quello di incorporare le copertine degli album in mp3. Se questo è il tuo obiettivo, ciò si adatterebbe meglio alle tue esigenze:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

-map_metadata = L' identificatore di metadati ffmpeg per l'output del file dall'infile. In questo caso ( zero ) i metadati globali.

-map 0 = Stream di input 1 (audio).

-map 1 = Input stream 2 (immagine).

Se nulla qui soddisfa le tue richieste, ti preghiamo di fornire maggiori informazioni.


Prendi in considerazione l'utilizzo -frameratecome opzione di input e la rimozione dell'output -r: in caso contrario verrà utilizzato il framerate di input predefinito di 25 e quindi ffmpegeliminerà i frame per ottenere -r 1. Se si dichiara semplicemente il frame rate di input, l'output utilizzerà lo stesso frame rate.
Llogan,

Grazie. Non lo sapevo. Modificato per riflettere le modifiche suggerite.
Fenrir,

Grazie per il tutorial. La mia riga di codice originale ffmpeg era una copia-incolla dalla ricerca di Google, che non ho idea di cosa sia cosa.
SIDU,
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.