Как создать MP4 с кодеком H.265, используя FFmpeg?

24

Я хочу закодировать видеофайл в H.265. Последняя версия ffmpeg должна поддерживать H.265 ( Source ).

Однако я не смог найти никакой информации о точной команде.

Я не знаю, какую библиотеку мне следует указывать после -vcodec.

Я использую последний Zeranoe FFmpeg Build (git-c78a416 (2013-10-26)).

skull3r7
источник

Ответы:

40

Задний план

FFmpeg поддерживает кодирование HEVC / H.265 с 2014-2-12 с помощью libx265. Теперь вы можете напрямую использовать ffmpeg для кодирования HEVC или использовать другой кодер, а затем вручную преобразовать его в .mp4, .mov или .mkv, используя FFmpeg.

Доступные кодеры

Текущие датчики H.265 / HEVC:

Только MulticoreWare и DivX предлагаются из-за их времени разработки и надежности.

Два х265

Одна путаница состоит в том, что есть два независимых проекта, оба названных "x265", один из которых был студентом китайского колледжа и практически мертв, а другой - коммерческая компания MulticoreWare. Несмотря на то, что первый появился первым, он практически мертв, а второй находится в стадии активной разработки и одобрен VideoLAN (разработчиком x264).

Временная шкала поддержки кодирования FFmpeg HEVC

  • 2013-10-12 Добавлена ​​поддержка muxing .mov 53f903b.
  • 2014-02-12 Добавлена ​​поддержка кодировки libx265 bb6b173.
  • 2014-03-09 Добавлена ​​более полная поддержка Matroska muxing для HEVC 38aee64.
  • 2014-03-09 Добавлена ​​более полная поддержка .mov и новая поддержка .mp4 muxing 9563e67.

ТЛ; др

В любом случае, это полный набор текущих возможностей кодирования HEVC в порядке моей рекомендации:

  • Непосредственное использование MulticoreWare libx265 с FFmpeg. Это означает, что с последней сборкой Zeranoe вы можете сделать это:

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mov
    # With audio
    ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=25 OUT.mov
    

    Примечание. Сборка FFmpeg новее, чем 2014-03-09, позволяет вам теперь мультиплексировать HEVC в файлы .mp4 (коммит 9563e67):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mp4
    

    Вы также можете добавить его в Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Используя автономный MulticoreWare x265, а затем смешайте полученный файл с FFmpeg или MP4Box . Это будет работать со старыми сборками FFmpeg, которые не поддерживают libx265.

    # Decode input using FFmpeg and encode using x265 using pipe
    ffmpeg -i INPUT -f yuv4mpegpipe -pix_fmt yuv420p - | \
    x265 --y4m -o encoded.265 -
    
    # Mux the resulting encoded .265 file into an .mp4 or .mov
    
    # Using ffmpeg: only works with newer builds that support muxing HEVC
    # Muxing to .mp4 supported since 03-09-2014
    ffmpeg -i encoded.265 -c copy out.mp4
    # With audio
    ffmpeg -i encoded.265 -i INPUT -map 0 -map 1:a -c copy out.mp4
    
    # Using MP4Box
    MP4Box -add raw.265 out.mp4
    # With audio
    MP4Box -add {INPUT}#audio -add raw.265 out.mp4
    

    Благодаря @Duvrai.

  • Использование DivX HEVC Encoder и затем его мультиплексирование.

    Способ его использования аналогичен использованию автономного x265 (см. Выше).

Обновление: FFmpeg теперь имеет поддержку кодирования HEVC с использованием MulticoreWare libx265.

Обновление 2: FFmpeg теперь поддерживает мультиплексирование HEVC в mp4 и mov теперь.

Тимоти Гу
источник
1
Для тех, кто не знает, что crf=25представляет символ
Programster
Чтобы уточнить комментарий @ Programster, ссылка ведет на руководство по x264, но x265 и x264 очень похожи в выборе CRF.
Тимоти Гу
Я не смог найти никакого руководства по CRF, специально предназначенного для h265, но концепция выглядит неизменной. В настоящее время я экспериментирую со значениями, которые он рекомендует (18-28), но не знаю, должны ли они немного отличаться для h265.
Программист
@Programster: Да, диапазон x265 составляет 0-51 . Однако по умолчанию значение равно 28 вместо 23.
Тимоти Гу
2
Отличный ответ в целом, но не хватает критического бита; -c:v libx265как есть, вышеприведенные примеры выводятся с использованием x264. Для наглядности ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4кодировал с x264, но ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4кодировал с x265.
rainabba
18

ffmpeg добавил кодировку x265 12 февраля 2014 года и поддержку контейнера mp4 9 марта:

ffmpeg -i input -c:v libx265 -c:a copy output.mp4

Заметка:

  • Приведенная выше команда скопирует аудио в исходный кодек. Если это не работает, конвертировать аудио в AAC, опуская -c:a copy(или заменить copyс aac, libfdk_aacили libfaac- упорядоченный по качеству видео )
  • при компиляции используйте ffmpeg --enable-libx265(и / --enable-libfdk-aacили --enable-libfaacесли нужно)
Duvrai
источник
1
FFmpeg изначально поддерживает мультиплексирование HEVC в mp4 с 3 по 9-2014.
Тимоти Гу
1
По какой-то причине результат был зеленый и розовый, но когда я добавил -pix_fmt yuv420pдо -c:v, результат был в порядке.
Евгений Сергеев