![Verwenden Sie DivX-Einstellungen, um mit ffmpeg in MP4 zu kodieren](https://rvso.com/image/1302234/Verwenden%20Sie%20DivX-Einstellungen%2C%20um%20mit%20ffmpeg%20in%20MP4%20zu%20kodieren.png)
Normalerweise verwende ich VirtualDub, um Videos mit DivX-Codec in einen AVI-Container (und MP3 für Audio) zu kodieren. Jetzt möchte ich ffmpeg verwenden, um Videos mit h264-Codec in einen MP4-Container zu kodieren. Ich habe herausgefunden, dass ich libx264 und eine dieser Voreinstellungen verwenden muss, damit alles funktioniert. Allerdings bin ich erstaunt über die Videobitrate, die ffmpeg zum Kodieren verwendet.
Was ich derzeit habe, ist diese kleine Batchdatei:
@ECHO OFF
SETLOCAL
SET IN=source.avs
SET FFMPEG_PATH=C:\Program Files (x86)\ffmpeg
SET PRESET=-fpre "%FFMPEG_PATH%\presets\libx264-lossless_slow.ffpreset"
SET AUDIO=-acodec libmp3lame -ab 128000
SET VIDEO=-vcodec libx264 -vb 1978000
"%FFMPEG_PATH%\ffmpeg.exe" -i %IN% %AUDIO% %VIDEO% %PRESET% test.mp4
ENDLOCAL
Damit sage ich ffmpeg, dass es 1978k als Bitrate verwenden soll, aber ffmpeg verwendet 15000k+! Ich habe andere Voreinstellungen ausprobiert, aber sie verwenden nicht meine angegebene Bitrate. Hier sind die Voreinstellungen, die ich habe:
- libx264-baseline.ffpreset
- libx264-ipod320.ffpreset
- libx264-ipod640.ffpreset
- libx264-lossless_fast.ffpreset
- libx264-lossless_max.ffpreset
- libx264-lossless_medium.ffpreset
- libx264-lossless_slow.ffpreset
- libx264-lossless_slower.ffpreset
- libx264-lossless_ultrafast.ffpreset
ffmpeg-Version:
FFmpeg git-N-29181-ga304071
libavutil 50. 40. 1 / 50. 40. 1
libavcodec 52.120. 0 / 52.120. 0
libavformat 52.108. 0 / 52.108. 0
libavdevice 52. 4. 0 / 52. 4. 0
libavfilter 1. 79. 0 / 1. 79. 0
libswscale 0. 13. 0 / 0. 13. 0
Beachten Sie, dass ich nicht die neueste Version verwende, da es Probleme mit Leerzeichen in Dateinamen gibt.
Dies scheint die vollständige Parameterliste zu sein, die DivX 6.9.2 verwendet:
-bvnn 1978000 -vbv 218691200,100663296,100663296 -dir "C:\Users\sjngm\AppData\Roaming\DivX\DivX Codec" -w -b 1 -use_presets=1 -preset=10 -windowed_fullsearch=2 -thread_delay=1
Welche Befehlszeilenparameter wären das für ffmpeg?
BEARBEITEN:
Ich habe slhcks Vorschlag befolgt und eine neue 32-Bit-Version ausprobiert. Ich habe keine Ahnung, ob das 0.9 oder neuer ist, ich kann diese Information nicht finden.
ffmpeg version N-36890-g67f5650
libavutil 51. 34.100 / 51. 34.100
libavcodec 53. 56.105 / 53. 56.105
libavformat 53. 30.100 / 53. 30.100
libavdevice 53. 4.100 / 53. 4.100
libavfilter 2. 59.100 / 2. 59.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 6.100 / 0. 6.100
libpostproc 51. 2.100 / 51. 2.100
Ich habe meine Batchdatei so überarbeitet, dass sie wie folgt aussieht (interessanterweise kann ich -vprofile
in der Dokumentation keinen Parameter finden):
@ECHO OFF
SETLOCAL
SET IN=VTS_01_1.avs
SET FFMPEG_PATH=C:\Program Files (x86)\ffmpeg
SET PRESET=-vprofile high -preset veryslow
SET AUDIO=-acodec libmp3lame -ab 128000
SET VIDEO=-vcodec libx264 -vb 1978000
"%FFMPEG_PATH%\ffmpeg.exe" -i %IN% %AUDIO% %PRESET% %VIDEO% test.mp4
ENDLOCAL
Ich sehe, dass die Bitrate jetzt richtig verwendet wird (danke an LongNeckbeard für den Hinweis, dass das verlustfreie Zeug die Bitrate ignoriert!).
Falls Sie sich fragen, wie ich auf 1978000 gekommen bin, verwende ich diese Formel, die ich für DivX-Dateien als gültig befunden habe (ich vermute, die Bitrate wird sich für h264 nicht so sehr ändern):
width * height * 25 * 0.22 / 1000
Ich bin nicht sicher, ob die 0,22 irgendwie mit dem CRF korreliert.
Insgesamt habe ich vergessen zu sagen, dass ich ein Two-Pass-Szenario verwenden werde, weshalb ich hier nicht das CRF verwende. Ich werde versuchen, mehr darüber zu lesen. Momentan versuche ich nur, etwas zum Laufen zu bringen, das mir zeigt, dass ich etwas richtig mache (ffmpeg ist nicht das am einfachsten zu verstehende Tool ;)).
C:\Program Files (x86)\ffmpeg\ffmpeg.exe" -i VTS_01_1.avs -acodec libmp3lame -ab 128000 -vcodec libx264 -vb 1978000 -vprofile high -preset veryslow test.mp4
Die Ausgabe ist jetzt:
ffmpeg version N-36890-g67f5650 Copyright (c) 2000-2012 the FFmpeg developers
built on Jan 16 2012 21:57:13 with gcc 4.6.2
configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-runtime-cpudetect --enable-avisynth --enable-bzlib --enable-frei0r --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib
libavutil 51. 34.100 / 51. 34.100
libavcodec 53. 56.105 / 53. 56.105
libavformat 53. 30.100 / 53. 30.100
libavdevice 53. 4.100 / 53. 4.100
libavfilter 2. 59.100 / 2. 59.100
libswscale 2. 1.100 / 2. 1.100
libswresample 0. 6.100 / 0. 6.100
libpostproc 51. 2.100 / 51. 2.100
Input #0, avs, from 'VTS_01_1.avs':
Duration: 00:58:46.12, start: 0.000000, bitrate: 0 kb/s
Stream #0:0: Video: rawvideo (YV12 / 0x32315659), yuv420p, 576x448, 77414 kb/s, 25 tbr, 25 tbn, 25 tbc
Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, 2 channels, s16, 1536 kb/s
File 'test.mp4' already exists. Overwrite ? [y/N] y
w:576 h:448 pixfmt:yuv420p tb:1/1000000 sar:0/1 sws_param:
[libx264 @ 05A2C400] using cpu capabilities: MMX2 SSE2Fast FastShuffle SSEMisalign LZCNT
[libx264 @ 05A2C400] profile High, level 3.1
[libx264 @ 05A2C400] 264 - core 120 r2120 0c7dab9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2011 - http://www.videolan.org/x264.html - options: cabac=1 ref=16 deblock=1:0:0 analyse=0x3:0x133 me=umh subme=10 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=24 chroma_me=1 trellis=2 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=8 b_pyramid=2 b_adapt=2 b_bias=0 direct=3 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=60 rc=abr mbtree=1 bitrate=1978 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'test.mp4':
Metadata:
encoder : Lavf53.30.100
Stream #0:0: Video: h264 (![0][0][0] / 0x0021), yuv420p, 576x448, q=-1--1, 1978 kb/s, 25 tbn, 25 tbc
Stream #0:1: Audio: mp3 (i[0][0][0] / 0x0069), 48000 Hz, 2 channels, s16, 128 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo -> libx264)
Stream #0:1 -> #0:1 (pcm_s16le -> libmp3lame)
Press [q] to stop, [?] for help
frame= 0 fps= 0 q=0.0 size= 0kB time=00:00:00.00 bitrate= 0.0kbits/s
frame= 0 fps= 0 q=0.0 size= 0kB time=00:00:00.00 bitrate= 0.0kbits/s
frame= 0 fps= 0 q=0.0 size= 0kB time=00:00:00.00 bitrate= 0.0kbits/s
frame= 3 fps= 1 q=22.0 size= 39kB time=00:00:00.04 bitrate=8063.8kbits/
frame= 8 fps= 2 q=22.0 size= 82kB time=00:00:00.24 bitrate=2801.3kbits/
frame= 13 fps= 3 q=23.0 size= 120kB time=00:00:00.44 bitrate=2229.5kbits/
frame= 16 fps= 4 q=23.0 size= 147kB time=00:00:00.56 bitrate=2156.7kbits/
frame= 20 fps= 4 q=22.0 size= 175kB time=00:00:00.72 bitrate=1987.4kbits/
:
video:4387kB audio:273kB global headers:0kB muxing overhead 0.260038%
[libx264 @ 05A2C400] frame I:2 Avg QP:19.53 size: 29850
[libx264 @ 05A2C400] frame P:76 Avg QP:22.24 size: 19541
[libx264 @ 05A2C400] frame B:359 Avg QP:25.93 size: 8210
[libx264 @ 05A2C400] consecutive B-frames: 0.5% 0.5% 0.0% 8.2% 17.2% 52.2% 16.0% 5.5% 0.0%
[libx264 @ 05A2C400] mb I I16..4: 5.4% 75.3% 19.3%
[libx264 @ 05A2C400] mb P I16..4: 1.3% 16.5% 2.2% P16..4: 36.3% 28.6% 12.7% 1.8% 0.2% skip: 0.4%
[libx264 @ 05A2C400] mb B I16..4: 0.4% 3.8% 0.3% B16..8: 40.0% 18.4% 4.7% direct:18.5% skip:13.9% L0:45.4% L1:38.1% BI:16.5%
[libx264 @ 05A2C400] final ratefactor: 20.35
[libx264 @ 05A2C400] 8x8 transform intra:83.1% inter:68.5%
[libx264 @ 05A2C400] direct mvs spatial:99.2% temporal:0.8%
[libx264 @ 05A2C400] coded y,uvDC,uvAC intra: 64.9% 83.4% 49.2% inter: 49.0% 50.4% 4.4%
[libx264 @ 05A2C400] i16 v,h,dc,p: 25% 22% 27% 26%
[libx264 @ 05A2C400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 10% 7% 23% 9% 10% 10% 10%10% 13%
[libx264 @ 05A2C400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 11% 13% 9% 12% 11% 10% 9% 12%
[libx264 @ 05A2C400] i8c dc,h,v,p: 42% 28% 16% 14%
[libx264 @ 05A2C400] Weighted P-Frames: Y:18.4% UV:7.9%
[libx264 @ 05A2C400] ref P L0: 29.1% 11.3% 15.7% 7.3% 6.9% 4.9% 5.1% 3.4%3.9% 2.7% 2.8% 1.8% 1.7% 1.2% 1.4% 0.9%
[libx264 @ 05A2C400] ref B L0: 68.8% 11.4% 5.5% 2.9% 2.3% 1.9% 1.5% 1.1%1.1% 1.0% 0.9% 0.7% 0.5% 0.3% 0.1%
[libx264 @ 05A2C400] ref B L1: 91.9% 8.1%
[libx264 @ 05A2C400] kb/s:2055.88
Für mich sieht es nicht so schlimm aus.
Antwort1
Sie sollten zunächst auf mindestens FFmpeg 0.9 aktualisieren. vpre
Es wird nicht mehr wirklich empfohlen, es zur Voreinstellungssteuerung zu verwenden. Aus diesem Grund ffpreset
wurden die Dateien aus neueren Versionen entfernt. Die Voreinstellungssteuerung für libx264 erfolgt jetzt über x264 selbst, nicht über FFmpeg.
Allerdings ist die Einstellung einer durchschnittlichen Bitrate für x264 dieWorst-Rate-Kontrollmoduses gibt. Anstelle einer durchschnittlichen Bitrate sollten Sie die Verwendung einer Zwei-Pass-Kodierung in Betracht ziehen, wenn Sie eine bestimmte Ausgabedateigröße anstreben oder eineKonstanter Ratenfaktor(CRF), wenn es Ihnen nur um das Erreichen einer bestimmten Qualität geht. Im Zweifelsfall verwenden Sie CRF.
Für die Verwendung von FFmpeg und x264 benötigen Sie im Allgemeinen die folgende Syntax:
ffmpeg -i in.mp4 -vcodec libx264 <options> out.mp4
… mit den folgenden optionalen Optionen. Es ist wichtig, diese vor der Ausgabe und nach dem vcodec
Schalter anzugeben. Dies sind nur einige (siehe auch dieOptionenzuordnungfür mehr):
-vprofile
: Legen Sie Einschränkungen für das h.264-Profil fest, z. B.baseline
,main
,high
-preset
: Legen Sie eine Kodierungsvorgabe fest, die im Allgemeinen Optimierungsstrategien ermöglicht. Sie können zwischenveryslow
,slow
,fast
,ultrafast
und vielen weiteren wählen. Langsamere Vorgaben führen zu einer besseren Komprimierung auf Kosten einer langsameren Kodierung. Sie verwenden im Allgemeinen die langsamste Vorgabe, für die Sie Geduld haben.-tune
: Einen speziellen Tune-Faktor einstellen, zB für Filme:film
-b
: Stellen Sie die Bitrate ein. Wie bereits gesagt, ist dies nicht wirklich das, was Sie bei einer One-Pass-Kodierung wollen, aber wenn es sein muss, sollte es funktionieren. Mögliche Werte sind in Bits oder eher500K
,1M
, usw.-crf
: Qualität festlegen. Schließt sich gegenseitig mit aus-b
. Ein guter Startwert ist 24. Ein niedrigerer Wert bedeutet höhere Qualität. Verwenden Sie den höchsten Wert, der Ihnen noch gut erscheint.
Beispiel für zwei Durchgänge, H.264-Video, AAC-Audio in MP4:
ffmpeg -i input -c:v libx264 -preset slow -b:v 500k -pass 1 -an -f mp4 -y NUL
ffmpeg -i input -c:v libx264 -preset slow -b:v 500k -pass 2 -c:a libfaac -b:a 128k output.mp4
CRF-Beispiel, H.264-Video, MP3-Audio in MKV:
ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv