![使用 DivX 設定透過 ffmpeg 編碼為 mp4](https://rvso.com/image/1302234/%E4%BD%BF%E7%94%A8%20DivX%20%E8%A8%AD%E5%AE%9A%E9%80%8F%E9%81%8E%20ffmpeg%20%E7%B7%A8%E7%A2%BC%E7%82%BA%20mp4.png)
我習慣使用 VirtualDub 將視訊編碼為帶有 DivX 編解碼器的 AVI 容器(音訊為 MP3)。現在我計劃使用 ffmpeg 使用 h264-codec 將影片編碼到 MP4 容器。我發現我需要使用 libx264 和這些預設之一才能使任何功能正常工作。然而,我對 ffmpeg 用於編碼的視訊位元率感到驚訝。
我目前擁有的是這個小批次檔:
@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
這樣我告訴 ffmpeg 使用 1978k 作為位元率,但 ffmpeg 使用 15000k+!我嘗試了其他預設,但它們不使用我指定的位元率。這是我的預設:
- 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版本:
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
請注意,我不使用最新版本,因為它有檔案名稱空格問題。
以下是 DivX 6.9.2 使用的完整參數清單:
-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
ffmpeg 的命令列參數是什麼?
編輯:
根據 slhck 的建議,我嘗試了一個新的 32 位元版本。我不知道這是 0.9 還是更新版本,我找不到該資訊。
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
-vprofile
我重新設計了我的批次文件,使其看起來像這樣(有趣的是我在文件中找不到參數):
@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
我發現它現在正確使用了比特率(感謝 LongNeckbeard 指出無損內容忽略了比特率!)。
萬一您想知道我是如何得出 1978000 的,我正在使用這個公式,我發現該公式對 DivX 文件有效(我猜 h264 的比特率不會改變那麼多):
width * height * 25 * 0.22 / 1000
我不確定 0.22 是否與 CRF 有某種關聯。
總的來說,我忘了說我將使用兩個場景,這就是為什麼我在這裡不使用 CRF 的原因。我會嘗試閱讀更多相關內容。目前,我只是想讓一些東西運行起來,以表明我正在做正確的事情(ffmpeg 不是最容易理解的工具;))。
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
現在的輸出是:
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
就我而言,它看起來並沒有那麼糟。
答案1
您應該首先至少升級到 FFmpeg 0.9。vpre
不再真正鼓勵用於預設控制。這就是這些ffpreset
文件已從新版本中刪除的原因。 libx264 的預設控制現在透過 x264 本身進行,而不是透過 FFmpeg。
話雖這麼說,設定 x264 的平均位元率是最差速率控制模式有。如果您的目標是特定的輸出檔案大小,或設定恆定速率因子(CRF)如果您只關心實現特定的品質。如有疑問,請使用 CRF。
您通常需要以下語法來使用 FFmpeg 和 x264:
ffmpeg -i in.mp4 -vcodec libx264 <options> out.mp4
...具有以下非強制性選項。在輸出之前和開關之後指定它們非常重要vcodec
。這些只是一些(另請參閱選項映射了解更多):
-vprofile
:設定 h.264 設定檔約束,例如baseline
、main
、high
-preset
:設定編碼預設,一般會啟用最佳化策略。您可以選擇veryslow
、slow
、fast
、ultrafast
等等。較慢的預設會導致更好的壓縮,但代價是編碼較慢。您通常會使用您有耐心的最慢的預設。-tune
:設定特殊的調諧因子,例如電影:film
-b
:設定比特率。正如已經說過的,這不是您真正想要的一次性編碼,但如果您需要,這應該可以工作。可能的值以位元為單位,或者更確切地說500K
,,,1M
等等。-crf
:設定品質。與 互斥-b
。較好的起始值為 24。使用您認為仍然不錯的最高值。
兩遍示例,H.264 視頻,MP4 中的 AAC 音頻:
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範例,MKV中的H.264視訊、MP3音訊:
ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv