![DivX設定を使用してffmpegでmp4にエンコードする](https://rvso.com/image/1302234/DivX%E8%A8%AD%E5%AE%9A%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6ffmpeg%E3%81%A7mp4%E3%81%AB%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B.png)
私は、VirtualDub を使用して、DivX コーデック (およびオーディオ用 MP3) でビデオを AVI コンテナにエンコードしていました。現在は、ffmpeg を使用して、h264 コーデックでビデオを MP4 コンテナにエンコードする予定です。私が理解したのは、libx264 とそれらのプリセットの 1 つを使用して、何も機能させる必要があるということです。しかし、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-ベースライン.ffプリセット
- libx264-ipod320.ffプリセット
- libx264-ipod640.ffプリセット
- libx264-lossless_fast.ffプリセット
- libx264-lossless_max.ffプリセット
- libx264-lossless_medium.ffプリセット
- libx264-lossless_slow.ffプリセット
- libx264-lossless_slower.ffプリセット
- libx264-lossless_ultrafast.ffプリセット
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 と何らかの相関関係にあるかどうかはわかりません。
全体的に、2 パス シナリオを使用すると言うのを忘れていました。そのため、ここでは 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 のプリセット制御は、FFmpeg ではなく、x264 自体を通じて行われるようになりました。
そうは言っても、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 です。値が低いほど品質が高くなります。適切と思われる最高の値を使用してください。
2 パスの例、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 の例、H.264 ビデオ、MKV の MP3 オーディオ:
ffmpeg -i input -c:v libx264 -preset medium -crf 24 -c:a libmp3lame -q:a 4 output.mkv