동일한 품질을 유지하면서 AVI (Xvid)를 MP4 (H.264)로 변환


45

h.264 코덱을 사용하여 AVI 파일을 MP4로 압축하고 싶습니다. 같은 품질을 얻을 수 없었습니다. 압축은 어떻게합니까?

원본 비디오 :

원본 비디오 화면 :

FFmpeg 콘솔 출력 ( ffmpeg -i input.avi) :

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree                                                                                         --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc                                                                                        ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop                                                                                        enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264                                                                                         --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)
  Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr,                                                                                         23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified

시험 1

FFmpeg 명령 :

ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4

테스트 1 화면 :

FFmpeg 콘솔 출력 ( ffmpeg -i 1.mp4)

    FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

시험 2

FFmpeg 명령 :

ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4

테스트 2 화면 :

FFmpeg 콘솔 출력 ( ffmpeg -i 2.mp4)

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

답변:


59

우선, 최신 버전의 FFmpeg를 설치하십시오 – 다운로드 페이지 에서 정적 빌드를 가져 오십시오 .

의 사용 vpre(디폴트 값을 설정하는 방법입니다 프리셋 는 FFmpeg , 설정 엔코더하지 설정) 정말 필요가 없습니다; 일반적으로 -preset인코더에서 정의한 옵션 을 사용하려고합니다 .

출력 품질이 낮은 이유는 다음 두 가지 경우입니다.

  1. 사용하는 첫 번째 경우 crf 25하는 일정한 속도 계수 거야 당신에게 (23)가 x264 인코더의 기본보다 더 품질을 제공합니다. CRF는 품질을 제어합니다. CRF, 20, 18 등을 낮게 설정하십시오. 여기서 낮을수록 품질은 좋아 지지만 파일 크기가 커집니다. CRF에서 6을 변경하면 대략적인 평균 비트 전송률의 두 배 / 반이됩니다.

    생성 손실 때문에 더 낮은 CRF를 설정해야합니다 . 이미 인코딩 된 것을 인코딩하고 있으므로 시각적 정보를 다시 버립니다. 결코 좋지는 않지만 입력 비디오에서 너무 많은 정보를 제거하지 않도록 더 높은 품질을 설정해야합니다.

  2. 두 번째 경우에는 고정 비트 전송률을 2MBit / s로 설정하려고합니다. 입력 비디오의 비트 전송률은 거의 같습니다. 이제 x264는 동일한 비트 전송률에 대해 MPEG-4 Visual 인코더보다 훨씬 우수한 시각적 품질을 제공하지만 생성 손실로 인해 원본보다 더 높은 비트 전송률을 사용하고 싶을 수도 있습니다. 그렇지 않으면 압축이 끝납니다. 너무 많은 정보.

    또한 일정한 비트 전송률 인코딩으로 인해 일부 구절이 좋아 보이지만 비디오의 다른 부분이 더 나빠질 수 있습니다. 인코더가 무언가에 쓰고 자하는 비트의 양을 자유롭게 선택하지 못하게하면 대상 파일 크기를 아는 대신 품질을 희생하게됩니다.

    x264에는 고정 비트 전송률 모드가 있지만 다른 인코딩 방법보다 열등한 것으로 간주됩니다. 실제로, 2- 패스 인코딩은 최적의 품질을 목표로하지 않습니다.

모든 것을 말하고 다음을 따라 해보십시오.

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4

libfdk_aac사용할 수없는 경우 대신 다음을 사용하십시오.

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4

주요 품질 관리 노브는 CRF 설정입니다. 더 좋은 품질이 필요하면이를 실험하고 더 낮은 값을 사용하십시오.

veryslow사전 설정 을 선택하면 압축률이 향상되지만 인코딩 시간이 더 오래 걸립니다.

합리적인 파일 크기로 적절한 품질의 파일을 얻을 수 없다면 운이 좋지 않습니다. 다시 인코딩하지 않고 원본 파일을 그대로 유지하는 것이 좋습니다. 이미 압축 된 것을 압축 할 때 "동일한 품질을 유지하는"도구는 없습니다.


두 번의 패스로 변환 한 후 비디오 크기가 더 작은 경우 더 높은 비트 전송률을 지정해야합니다. 시도해보십시오 -b:v 3M; 그러나 2 패스 변형 대신 CRF 방법을 사용하는 것이 좋습니다.
slhck

9
@AhmetKa 또 다른 옵션은 스트림을 AVI 컨테이너에서 MP4 컨테이너로 간단히 다시 mux하는 것 ffmpeg -i input.avi -c copy -map 0 output.mp4입니다. 재 인코딩이 없으므로 품질 손실이 없습니다.
llogan

1
@AhmetKa 출력 컨테이너 형식이 입력의 미디어 형식을 지원하지 않으면 muxing이 항상 작동하지는 않습니다. 작동 방식에 대한 일반적인 아이디어를 얻으려면 컨테이너 형식 비교를 참조하십시오 .
llogan

@slhck Crf이 (가) 다시 잘못되었습니다. 비트 레이트, 너비, 높이 등 계산할 수 있습니까?
Ahmet KAPIKIRAN

3
@hyde 더 나은 품질을 제공하기 때문에 -c:a aac -strict experimental대신에 선호해야합니다 libvo_aacenc.
slhck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.