Конвертировать AVI (Xvid) в MP4 (H.264), сохраняя то же качество

48

Я хочу сжать 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
Ахмет КАПИКИРАН
источник

Ответы:

60

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

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

slhck
источник
Если ваше видео меньше по размеру после преобразования за два прохода, вам нужно указать более высокую скорость передачи данных. Попробуй -b:v 3Mили больше; но я бы рекомендовал использовать метод CRF вместо двухпроходного варианта.
Slhck
10
@AhmetKa Другим вариантом является просто повторно MUX потоки из AVI контейнера в контейнер MP4: ffmpeg -i input.avi -c copy -map 0 output.mp4. Нет перекодирования, поэтому нет потери качества.
Llogan
1
@AhmetKa Я должен был упомянуть, что мультиплексирование не всегда будет работать, если формат выходного контейнера не поддерживает медиаформаты ввода. См. Сравнение форматов контейнеров, чтобы получить общее представление о том, что работает.
Llogan
Здравствуйте еще раз @slhck Crf не правильно. Битрейт, ширина, высота и т. Д. Могу ли я рассчитать?
Ахмет КАПИКИРАН
3
@hyde Вы должны предпочесть -c:a aac -strict experimentalвместо libvo_aacenc, потому что это обеспечивает лучшее качество.
slhck