41

Я хочу сжать AVI-файл в MP4 с помощью кодека h.264. Я не мог получить то же качество. Как я могу сжать это?

Оригинальное видео:

Оригинальный видеоэкран:

Вывод консоли 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

1 ответ1

55

Прежде всего, установите более свежую версию FFmpeg - возьмите статическую сборку со страницы загрузки.

Использование предустановок vpre (что является способом установки значений по умолчанию для настроек ffmpeg , а не настроек кодировщика) не является действительно необходимым; Вы обычно хотите использовать параметры -preset , определенные кодировщиками.

Причины, по которым вы получаете низкое качество продукции, заключаются в следующем, соответственно для двух ваших случаев:

  1. В первом случае вы используете crf 25 , коэффициент постоянной скорости, который даст вам худшее качество, чем по умолчанию для кодера x264 (который равен 23). CRF контролирует качество. Попробуйте установить более низкий CRF, может быть, 20, 18 и т.д. Здесь, ниже означает лучшее качество, но это увеличит размер файла. Изменение 6 в CRF дает вам вдвое / половину первоначального среднего битрейта, грубо говоря.

    Вам придется установить более низкий CRF из-за потери генерации. Вы кодируете то, что уже было закодировано, поэтому вы снова выбрасываете визуальную информацию. Это никогда не бывает хорошо, но если вам нужно, вам нужно будет установить более высокое качество, чтобы не удалять слишком много информации из входного видео.

  2. Во втором случае вы пытаетесь установить постоянную скорость передачи данных 2 Мбит / с. Ваше входное видео примерно имеет такую же скорость передачи данных. Теперь x264 обеспечивает гораздо лучшее визуальное качество, чем визуальный кодер MPEG-4 для того же битрейта, но из-за потери генерации, опять же, вы можете использовать битрейт даже выше, чем оригинал, иначе вы в конечном итоге сожмете слишком много информации.

    Кроме того, постоянное кодирование битрейта может привести к тому, что некоторые фрагменты будут выглядеть хорошо, но другие части видео будут выглядеть хуже. Если вы не позволите кодировщику свободно выбирать количество битов, которые он хочет потратить на что-то, вы жертвуете качеством за счет знания целевого размера файла.

    x264 имеет режим постоянной скорости передачи данных, но считается, что он уступает другим методам кодирования. На самом деле, двухпроходное кодирование не предназначено для достижения оптимального качества, так что оставьте это.

Это все, как говорится, попробуйте что-то вроде следующего:

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 , которая обеспечит лучшее сжатие, но кодирование, очевидно, займет больше времени.

Если вам не удается получить файл достойного качества при разумном размере файла, то вам не повезло. Лучше сохранить исходный файл как есть, без перекодирования. Там нет волшебного инструмента "сохранить то же качество", когда вы сжимаете что-то, что уже сжато.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .