Sono “un noob completo del video editing, quindi perdonami se chiedo qualcosa di ridicolo.
Sto ricevendo video clip da un registratore set top. 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 lFPS sono ben oltre ciò che mi serve, 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à molto più di quanto mi aspettassi.
Ho esaminato 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 il motivo Non userei gli stessi formati di output dei formati di input. Ho provato a usare questo comando per forzare luso di H.264:
ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi
Purtroppo 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 motivo per cui non posso farlo. Lesecuzione di “ffmpeg -formats” elenca h264 come uno che potrebbe usare sia per linput che per loutput.
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.
MODIFICA
Ho trovato una soluzione esaminando luso dei preset. Dopo aver cercato informazioni sui predefiniti, 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 limpostazione predefinita corretta in questo modo:
ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi
Ho ancora qualche aggiustamento da fare, ma questo è fondamentalmente quello che volevo. Grazie.
Commenti
- Certo, alcune persone vogliono semplicemente sapere come convertire i file Avermedia .avi .mp4 in modo da giocare su Mountain Lion / Mavericks < pre > ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 < / pre >
Risposta
I ” 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 fa?;)). Deve esserci un interruttore per la codifica multipass. So che ci sono alcuni preset incorporati che potresti probabilmente usare e fare quasi certamente ciò a cui miri. Questi sono normalmente chiamati preset x264 o x264 tune. Riesci a trovare qualcosa del genere?
Commenti
- Grazie. Il tuo discorso sui preset mi ha aiutato a trovare una probabile soluzione. ‘ modifico il post per mostrare cosa ho fatto.
- Bella soluzione. Aggiunto alla mia raccolta di snippet. Grazie.
- @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.
Risposta
ffmpeg ha rimosso le preimpostazioni x264 quindi Limpostazione -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 è lalgoritmo di downscaling, lanczos è consigliato in quanto produce il minor numero di artefatti senza sfocature ma lo è lento.
-vf "scale=..."
si spiega da sé, specifica la risoluzione di output
-crf 20
questo è il qualità, 20 è una buona impostazione di output finale (non usarla prima della modifica), questa è una qualità costante ed è lopzione migliore quando la dimensione del file non è stretta e produrrà una qualità migliore con la dimensione del file più bassa di qualsiasi 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. ) deve essere utilizzato solo durante lo streaming, un caso speciale è” 0 “che è senza perdite e lintervallo di questa opzione va da 1 (qualità massima) a 50 (qualità minima).
Un buon test per questo è eseguire la codifica con -crf 20 prendere nota del bitrate, quindi usarlo come impostazione -b per una seconda versione del file entrambe dovrebbero avere la stessa dimensione del file, confrontare le due per differenze di qualità.
-preset veryslow
in questo modo si sceglie la quantità di CPU che si desidera utilizzare, più lenta è minore è la dimensione del file e migliore è la qualità.
-profile:v main
questo è il profilo H.264 da usare. alto è la dimensione del file più efficiente in termini di dimensioni ma utilizza molta CPU per decodificare rispetto agli altri formati, che è detto che è il più popolare poiché la maggior parte dei cellulari ha un decodificatore hardware integrato e il flash player lo supporta, il mio non lo fa quindi devo usa main.
-tune fastdecode
al mio cellulare non piace riprodurre i file senza questa opzione, ma di solito questo può essere lasciato vuoto o impostato su “film” per i videogiochi, il Il motivo principale per cui lo usi è per ottenere un po di qualità in più.
E lultima cosa che consiglio vivamente di utilizzare un moderno formato contenitore .avi non è “progettato per contenere H.264 e da quello che ho capito” Non è 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 tendono ad avere problemi, usa mkv o mp4.
Commenti
- Le preimpostazioni per libx264 sono ora specificate da
-preset
come in-preset slow
-
-tune fastdecode
disabilita il deblock e i frame B e P ponderati, nonché CABAC. Esistono decoder in grado di gestire i frame B, ma non CABAC? Suggerirei-profile:v baseline
, se hai bisogno di scegliere come target vecchi decoder hardware. (fastdecode
potrebbe essere utile se scegli un softwa re decoder su una CPU lenta, ma non un decoder hardware.) Main con frame B ma senza deblock o CABAC potrebbe o non potrebbe sembrare migliore della baseline con deblock. +1 per aver consigliato non-AVI per la memorizzazione di h.264. IIRC, il principale sono i frame B, ma sì, h.264 in avi non è ben standardizzato, ed è ‘ hacky. - I ‘ d chiama
-crf 20
una finale alta. Puoi cambiarlo in 22 o anche 24 e probabilmente andrà bene, a meno che non sia ‘ un forte movimento, come un evento sportivo.
Risposta
Ci sono alcune cose da chiarire:
- Un formato è non un codec; desideri ottenere un file in formato avi con video codificato con h264 codec. Usa solo -vcodec libx264 e un nome file con .avi . Ffmpeg dovrebbe riconoscere un formato guardando unestensione di file, ma potresti anche essere specifico aggiungendo -f avi . Sicuramente non vuoi usare mpeg1, perché offre una qualità peggiore di mpeg2 o addirittura peggiore rispetto a mpeg4, che consiglio.
- Il tuo problema era che ffmpeg usava solo la qualità più bassa possibile perché non ne hai specificata alcuna. Lopzione -sameq sembra funzionare raramente 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 3Mb / s, che offre una qualità abbastanza buona. Immagino che sarebbe sufficiente anche per te avere 2 Mb / s per la risoluzione menzionata.
- La chiave per ridurre la dimensione del file non è la risoluzione, ma il bitrate menzionato sopra. Preferirei attenermi alla risoluzione originale e manipolare semplicemente il bitrate.
- Immagino che tu voglia anche mantenere laudio senza conversione (quindi senza perdita di qualità), quindi usa -acodec copy .
Prova questo: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lower res.avi
Commenti
- Il bitrate costante è il peggiore (in termini di qualità rispetto alle dimensioni) di tutte le modalità di controllo della velocità in x264 e dovrebbe essere evitato. Utilizza
-crf
per impostare invece una modalità di qualità costante.