Come sottocampionare da 4k a 1080p usando ffmpeg mantenendo la qualità?


21

Ho alcuni filmati 4K 3840x2160 in formato MP4 che devo ridurre a 1080p. Ho provato a correre

ffmpeg -i orig.mp4 -vf scale=1920:1080 smaller.mp4  

ma il risultato è di pessima qualità, con l'intera immagine composta da "tessere" quadrate come se stessi ingrandendo 4: 1.

Ecco l'output dell'esecuzione di questo comando:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'origs/P1000003.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
  Duration: 00:05:14.48, start: 0.000000, bitrate: 95903 kb/s
    Stream #0.0(und): Video: h264 (High), yuvj420p, 3840x2160 [PAR 1:1 DAR 16:9], 95792 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 125 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
[buffer @ 0x22a3420] w:3840 h:2160 pixfmt:yuvj420p
[scale @ 0x22a3ce0] w:3840 h:2160 fmt:yuvj420p -> w:1920 h:1080 fmt:yuv420p flags:0x4
Output #0, mp4, to '1-short.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 1
    compatible_brands: mp42avc1
    creation_time   : 2015-02-19 17:10:38
    encoder         : Lavf53.21.1
    Stream #0.0(und): Video: mpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 tbn, 25 tbc
    Metadata:
      creation_time   : 2015-02-19 17:10:38
    Stream #0.1(und): Audio: libvo_aacenc, 48000 Hz, stereo, s16, 200 kb/s
    Metadata:
      creation_time   : 2015-02-19 17:10:38
Stream mapping:
  Stream #0.0 -> #0.0
  Stream #0.1 -> #0.1
Press ctrl-c to stop encoding
frame=  125 fps=  6 q=31.0 Lsize=     968kB time=5.00 bitrate=1586.7kbits/s    
video:842kB audio:123kB global headers:0kB muxing overhead 0.421047%

So per esperienza che ffmpeg è uno strumento eccellente, quindi devo in qualche modo rovinare le opzioni / i parametri ...

Come posso fare questo?


Mostra l'output completo e completo della console dal tuo comando. Puoi semplicemente codificare un breve segmento, quindi aggiungi -t 10per creare un output di 10 secondi. Perché vuoi ridimensionare? Qual è il caso d'uso per l'output ridimensionato? Queste informazioni mi aiuteranno a fornire una risposta più accurata.
Llogan,

@LordNeckbeard Ho appena aggiunto l'output della console. Voglio ridimensionare in modo da poter condividere più facilmente queste clip con le persone che lavorano con me.
Lara Michaels,

1
Non dimenticare -c:a copy, poiché non vuoi o non devi ricodificare il flusso audio. Utilizzare -map 0per copiare metadati di capitolo o altre cose. (ffmpeg accetta solo 1 video + 1 aud di default.)
Peter Cordes

1
Inoltre, -sws_flags lanczos+print_infoutilizzerà un algoritmo di ridimensionamento migliore rispetto a quello predefinito (credo bilineare). La risposta di stlb copre la parte della codifica video del processo.
Peter Cordes,

2
@PeterCordes Alternativamente, scale=1920:-2:flags=lanczos. Avevo anche menzionato la -2scala for nella mia risposta inesistente. Per chi non lo sapesse, puoi inserire -2larghezza o altezza e fornirà automaticamente il valore corretto preservando le proporzioni e rendendo il valore divisibile per 2 (richiesto da libx264 per le uscite yuv420p).
Llogan,

Risposte:


17

Le impostazioni predefinite per ffmpeg sono di qualità molto bassa, e poiché non specifichi alcun codec o parametri di qualità, utilizza solo le impostazioni predefinite (non so perché gli sviluppatori non lo riparino perché genera molte domande sui forum ovunque).

Modifica : i valori predefiniti ora sono abbastanza sani. Con una build recente di ffmpeg non è necessario specificare altro che file di input e output per ottenere buoni risultati utilizzabili. Ovviamente puoi modificare il desiderio del tuo cuore.

Prova ad aggiungere -c:v libx264 -crf 20 -preset slowal comando.

  • -c:v libx264 gli dice di usare l'encoder libx264,
  • crf 20 utilizza il quantizzatore del fattore di frequenza costante (che paradossalmente significa bit rate variabile, ma qualità costante) con un valore di 20 (qualità abbastanza buona; minore è la migliore qualità / file più grandi, maggiore è più scadente / più piccolo),
  • il slowpreset è una scorciatoia per un sacco di impostazioni dell'encoder, il che significa che ci mette un po 'più di sforzo rispetto al default (medio).

È possibile modificare queste impostazioni, consultare la guida alla codifica h.264 per istruzioni su quali manopole modificare.

E se stai usando l'audio così com'è, aggiungi c:a copy. Ciò farà una copia diretta del flusso audio senza ricodifica.


I valori predefiniti dipendono dall'encoder. libx264 è di solito usato per l'output MP4 di default, e produce un output di buona qualità senza opzioni aggiuntive, ma la build ffmpeg nella domanda sembra non supportare questo codificatore e quindi utilizza l'antico codificatore che mpeg4produce video MPEG-4 parte 2, e i valori predefiniti per esso erano più sani durante il suo periodo di massimo splendore (come per 320x240, ecc.).
Llogan,

È bello sapere che libx264 è l'impostazione predefinita ora.
Stib

Direi che crf 20 è dannatamente buono. 18 è funzionalmente senza perdita di dati. Faccio la maggior parte dei miei video alle 23.
user24601

Gran parte del mio lavoro viene visualizzato su dispositivi di riproduzione che funzionano localmente da una scheda SD. Non ho bisogno di ottimizzare molto per le dimensioni, quindi lascio la qualità più alta che posso. Sono d'accordo, lo chiamerei se stavo consegnando sul web.
Stib

Questo non mi ha aiutato. Ho ancora stranezze strane ovunque si verifichi il movimento nel video. crf di 18, preimpostato per rallentare. 2.7k-> 1080p.
Rewolf,

0

Usa avconv se vuoi:

avconv -i 4kfile.mp4 -s hd1080 -c:v libx264 -c:a copy fullhdfile.mp4
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.