DivX 설정을 사용하여 ffmpeg로 mp4로 인코딩

DivX 설정을 사용하여 ffmpeg로 mp4로 인코딩

저는 VirtualDub를 사용하여 DivX 코덱(및 오디오용 MP3)이 포함된 AVI 컨테이너로 비디오를 인코딩하는 데 익숙합니다. 이제 ffmpeg를 사용하여 h264 코덱을 사용하여 비디오를 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와 어떻게든 상관관계가 있는지 잘 모르겠습니다.

전반적으로 나는 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

관련 정보