Come posso usare FFmpeg per ridurre la qualità del video H264 ma mantenerlo nel formato H264?


8

Sono un noob completo per l'editing video, quindi perdonami se chiedo qualcosa di ridicolo.

Ricevo videoclip da un set top box del registratore. Le clip sono file AVI:

Resolution: 1920 x 1080
Frames Per Second: 60
Video Format: ITU H.264
Audio Format: MPEG 1 Audio, Layer 3 (MP3)

La risoluzione e l'FPS vanno ben oltre ciò di cui ho bisogno, quindi sto cercando di eseguire un comando per ridimensionare le cose:

ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi

Questo è riuscito a darmi la risoluzione, il framerate e la dimensione del file desiderati, ma ha anche degradato la qualità in modo più del previsto.

Ho guardato il nuovo file e ho scoperto che per qualche motivo FFmpeg ha convertito il formato utilizzato:

Video Format: FFmpeg MPEG-4
Audio Format: MPEG 1 Audio, Layer 2

Non mi è chiaro perché non utilizzi gli stessi formati di output dei formati di input. Ho provato a usare questo comando per forzarlo a usare H.264:

ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi

Sfortunatamente, non è riuscito con il seguente output:

ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
  built on Jan  4 2012 16:21:50 with gcc 4.6.1
  configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  WARNING: library configuration mismatch
  avutil      configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avcodec     configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avformat    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avdevice    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avfilter    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  swscale     configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  postproc    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  libavutil    51.  7. 0 / 51.  7. 0
  libavcodec   53.  6. 0 / 53.  6. 0
  libavformat  53.  3. 0 / 53.  3. 0
  libavdevice  53.  0. 0 / 53.  0. 0
  libavfilter   2.  4. 0 /  2.  4. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  52.  0. 0 / 52.  0. 0
Input #0, avi, from 'highres.avi':
  Metadata:
    comment         : Quality_GOOD
    encoder         : Lavf52.64.2
    encoded_by      : AverMedia_c281_1.7.2
  Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s
    Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
[buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p
[scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4
[libx264 @ 0x8f0fb40] broken ffmpeg default settings detected
[libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x8f0fb40] speed presets are listed in x264 --help
[libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high
Output #0, h264, to 'lowerresforceh264.avi':
    Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height

Non sono sicuro del perché non posso farlo. L'esecuzione di "ffmpeg -formats" elencava h264 come uno che poteva usare sia per input che per output.

Se qualcuno potesse indicarmi la giusta direzione, lo apprezzerei molto. Grazie.

PS: sto usando FFmpeg versione 0.7.3-4: 0.7.3-0 su Ubuntu 11.10.

MODIFICARE

Ho trovato una soluzione guardando l'uso dei preset. Dopo aver cercato informazioni sui preset, ho trovato il seguente tutorial che li discuteva:

http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-presets.html

Avevo solo bisogno di specificare il codec e le impostazioni predefinite appropriate in questo modo:

ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi

Ho ancora alcune modifiche da fare, ma questo è fondamentalmente quello che volevo. Grazie.


Certo, alcune persone vogliono semplicemente sapere come convertire i file .avi Avermedia .mp4 in modo da giocare su Mountain Lion / Mavericks <pre> ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 </pre>

Risposte:


3

Sto cercando di aiutare. Innanzitutto, non capisco perché stai dicendo che FFMPEG H.264 non è il formato di input?

Non conosco abbastanza bene la riga di comando FFMPEG (c'è qualcuno che lo fa?;)). Deve esserci un interruttore per la codifica multipass. So che ci sono alcuni preset incorporati che potresti probabilmente usare e quasi certamente quello a cui stai mirando. Questi sono normalmente chiamati preset x264 o melodia x264. Riesci a trovare qualcosa del genere?


Grazie. Il tuo discorso sui preset mi ha aiutato a trovare una soluzione probabile. Modificherò il post per mostrare cosa ho fatto.
BigBeagle,

Bella soluzione. Aggiunto alla mia raccolta di frammenti. Grazie.
Zettt,

2
@BigBeagle: quando trovi una risposta alla tua domanda, puoi pubblicarla come risposta. La modifica della domanda viene eseguita per fornire maggiore chiarezza alla domanda. A quanto ho capito, le risposte vanno nella sezione delle risposte.
Nav

8

ffmpeg ha rimosso i suoi preset x264 quindi l'impostazione -vpre non funziona più.

Ora, ho uno script per convertire i file video in un formato che il mio cellulare può gestire.

ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv

Spiegherò ogni opzione

-sws_flags lanczos+accurate_rnd questa opzione è l'algoritmo di ridimensionamento, si consiglia lanczos in quanto produce il minor numero di artefatti senza sfocature ma è lento.

-vf "scale=..." è autoesplicativo specificare la risoluzione di output

-crf 20questa è la qualità, 20 è una buona impostazione di output finale (non usarla prima della modifica), questa è qualità costante ed è l'opzione migliore quando la dimensione del file non è ridotta e produrrà una qualità migliore alla dimensione del file più bassa di ogni altra cosa , altrimenti usa due passaggi per la massima qualità a una dimensione di file specifica (come la necessità di adattarlo a un CD o DVD), bitrate fisso (es. -b 2000k) dovrebbe essere usato solo durante lo streaming, un caso speciale è '0' che è senza perdita e la gamma di questa opzione va da 1 (massima qualità) a 50 (minima qualità).

Un buon test per questo è quello di eseguire la codifica con -crf 20 prendere nota del bitrate e quindi usarlo come impostazione -b per una seconda versione del file, entrambi dovrebbero avere le stesse dimensioni del file, confrontare i due per qualità differenze.

-preset veryslow questo sceglie la quantità di CPU che si desidera utilizzare, più lenta è la dimensione del file e una qualità migliore.

-profile:v mainquesto è il profilo H.264 da usare. alta è la dimensione del file più efficiente per quanto riguarda la decodifica, ma utilizza molta CPU per decodificare rispetto agli altri formati, detto che è il più popolare in quanto la maggior parte dei telefoni cellulari ha un decodificatore hardware integrato e il lettore flash lo supporta, il mio no, quindi devo usa principale.

-tune fastdecode al mio cellulare non piace riprodurre i file senza questa opzione, ma di solito questo può essere lasciato in bianco o impostato su 'film' per i videogiochi, il motivo principale per cui lo usi è per ottenere un po 'di qualità extra.

E l'ultima cosa che consiglio vivamente di usare un moderno formato contenitore .avi non è progettato per contenere H.264 e da quello che capisco non esiste uno standard per la memorizzazione di H.264 o per rendere il file più grande di 2 GB, la maggior parte delle implementazioni sono hack e inclini per avere problemi, usa mkv o mp4.


I preset per libx264 sono ora specificati -presetcome in-preset slow
stib il

-tune fastdecodedisabilita il deblocking e i frame B e P ponderati, nonché CABAC. Esistono decodificatori in grado di gestire frame B, ma non CABAC? Vorrei suggerire -profile:v baseline, se è necessario targetizzare i vecchi decodificatori hardware. ( fastdecodepotrebbe essere utile se si sceglie come target un decodificatore software su una CPU lenta, ma non un decodificatore hardware.) Principale con frame B ma nessun deblock o CABAC potrebbe o non avere un aspetto migliore rispetto alla baseline con il deblock. +1 per raccomandare non AVI per la memorizzazione di h.264. IIRC, il principale è i frame B, ma sì, l'h.264 in avi non è ben standardizzato, ed è confuso.
Peter Cordes,

Definirei -crf 20un finale alto. Puoi cambiarlo in 22 o anche 24 e probabilmente stare bene, a meno che non sia un movimento elevato, come un evento sportivo.
user24601

2

Ci sono alcune cose da chiarire:

  • Un formato non è un codec; vuoi ottenere un file in formato avi con video codificato con codec h264 . Basta usare -vcodec libx264 e un nome file con .avi . Ffmpeg dovrebbe riconoscere un formato guardando un'estensione di file, ma potresti anche essere specifico aggiungendo -f avi . Sicuramente non vuoi usare mpeg1, perché offre una qualità peggiore di mpeg2 o anche peggio rispetto a mpeg4, che consiglio.
  • Il tuo problema era che ffmpeg utilizzava la qualità più bassa possibile perché non ne hai specificata alcuna. L'opzione -sameq sembra raramente funzionare per me. In effetti, è molto utile impostare manualmente il bitrate. Aggiungi, ad esempio, -vb 3000k per ottenere un file con un bitrate video medio di 3 Mb / s, che offre una qualità abbastanza buona. Immagino che sarebbe sufficiente per te avere 2 Mb / s per la risoluzione menzionata.
  • La chiave per ridurre la dimensione del file non è la risoluzione, ma il bitrate sopra menzionato. Preferirei attenermi alla risoluzione originale e manipolare semplicemente il bitrate.
  • Suppongo che tu voglia anche mantenere l'audio senza conversione (quindi senza perdita di qualità), quindi usa -acodec copy .

Prova questo: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lowerres.avi


4
Il bitrate costante è il peggiore (in termini di qualità vs. dimensione) di tutte le modalità di controllo della velocità in x264 e dovrebbe essere evitato. Utilizzare invece -crfper impostare una modalità di qualità costante.
slhck,
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.