Come posso cambiare le dimensioni del frame, preservando la larghezza (usando ffmpeg)?


21

Sono nuovo di questo sito StackExchange e dell'utilizzo dell'encoder FFmpeg. Ho un video di 720x480 (3: 2) che vorrei cambiare in 720x406 (16: 9) per abbinare gli altri video che ho per un sito. Ho provato varie combinazioni di comandi, tra cui:

ffmpeg -i myfile.mv4 -s 720x406 outfile.mp4
ffmpeg -i myfile.m4v -c copy -aspect 16:9 outfile.mp4

Quello che ho finito è un video ridimensionato all'altezza specificata, ma non ha conservato la larghezza. Finisce a 608x406 o giù di lì. Ho giocato con varie versioni della GUI di FFmpeg oggi, e sembrano fare la stessa cosa.

Quali sarebbero le opzioni / i parametri corretti da passare (supponendo che avrò più controllo tramite la riga di comando) per ottenere la dimensione del frame desiderata?

Risposte:


36

l'uso del filtro scala lo farà, ma c'è qualcosa in più.

ffmpeg -i input.mov -vf scale=720x406 output.mov 

creerà un filmato con le dimensioni in pixel richieste, ma se guardi l'output scoprirai che aggiunge informazioni nei metadati in modo che venga riprodotto con le stesse proporzioni dell'originale, usando pixel non quadrati. Quindi, se si desidera estendere il film in modo anamorfico a un nuovo formato, è necessario impostare manualmente il formato pixel, chiamato SAR per "Sample Aspect Ratio", quindi per i pixel quadrati utilizzare:

ffmpeg -i input.mov -vf scale=720x406,setsar=1:1 output.mov

In alternativa puoi impostare le proporzioni di visualizzazione su quello che vuoi, quindi:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 output.mov

Quello che sto facendo con il comando -vf e le espressioni x = y, z = a che seguono è la creazione di una catena di filtri . I filtri possono essere piuttosto complessi, ma nell'uso più semplice prendono la forma effect=parameter,nexteffect=anotherparametere vengono elaborati nell'ordine in cui li scrivi.

Potresti voler inserire comandi aggiuntivi per il codec e così via, ad esempio -c:v libx264per utilizzare l'encoder x264 mp4 e qualcosa di simile -crf 20a impostare il fattore di frequenza costante su 20 (di solito un buon compromesso tra dimensioni e qualità). Quindi, un comando ragionevolmente completo sarebbe simile a:

ffmpeg -i input.mov -vf scale=720x406,setdar=16:9 -c:v libx264 -preset slow -profile:v main -crf 20 output.mov

Il profilo principale è buono per la compatibilità dei dispositivi, il slowpreset per l'encoder libx264 è un buon compromesso tra velocità e qualità, quindi questo è un buon cavallo di lavoro per la codifica web generale. Puoi renderlo più veloce usando fasto veryfasto più lentamente con veryslowe placebolo renderai sempre leggermente migliore che veryslowa scapito di molto più tempo di elaborazione (da qui il nome).

BTW Non utilizzare la copia -c , che significa semplicemente copiare il video e flussi audio senza fare nulla per loro a tutti , in modo da niente che fare in termini di scala, codec, bitrate, ecc avrà alcun effetto.


1
Se stai usando le versioni recenti di ffmpeg non devi più stabilire x264 come codec, ma potrebbe comunque valere la pena guardare quali impostazioni potresti desiderare.
Stib

1
Penso che i metadati abbiano solo un campo DAR. Quindi l'utilizzo setsarsta semplicemente impostando indirettamente il DAR?
jiggunjer,

Devo usare "-c copy", ma dall'altro lato voglio ridimensionare lo schermo. Come posso raggiungere questo obiettivo?
Dr.jacky,

1
@ Mr.Hyde dovresti porlo come una nuova domanda invece di porre in un commento
stib
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.