Jak wygenerować MP4 z kodekiem H.265 za pomocą FFmpeg?

24

Chcę zakodować plik wideo do H.265. Ostatnia wersja ffmpeg powinna obsługiwać H.265 ( źródło ).

Nie mogłem jednak znaleźć żadnych informacji o dokładnym poleceniu.

Nie wiem, po której bibliotece powinienem wskazać -vcodec.

Używam najnowszej wersji Zeranoe FFmpeg (git-c78a416 (2013-10-26)).

skull3r7
źródło

Odpowiedzi:

40

tło

FFmpeg obsługuje kodowanie HEVC / H.265 od 2014-2-12 z libx265. Teraz możesz użyć ffmpeg bezpośrednio do kodowania HEVC lub użyć innego enkodera, a następnie ręcznie zmiksować go do .mp4, .mov lub .mkv za pomocą FFmpeg.

Dostępne kodery

Aktualne kodery H.265 / HEVC to:

Sugerowane są tylko MulticoreWare i DivX ze względu na ich czas rozwoju i niezawodność.

Dwa x265

Jednym zamieszaniem jest to, że istnieją dwa niezależne projekty o nazwie „x265”, jeden przez chińskiego studenta i praktycznie nie żyje, a drugi przez komercyjną firmę o nazwie MulticoreWare. Chociaż pierwszy z nich zaczął się jako pierwszy, jest teraz praktycznie martwy, a drugi jest w trakcie aktywnego rozwoju i jest wspierany przez VideoLAN (twórca x264).

Oś czasu obsługi kodowania HEF FFmpeg

  • 2013-10-12 Dodano obsługę multipleksowania .mov 53f903b.
  • 2014-02-12 Dodano obsługę kodowania libx265 bb6b173.
  • 2014-03-09 Dodano bardziej kompletną obsługę multipleksowania Matroska dla HEVC 38aee64.
  • 2014-03-09 Dodano pełną obsługę .mov i nową obsługę multipleksowania .mp4 9563e67.

tl; dr

Tak czy inaczej, jest to kompletny zestaw aktualnych możliwości kodowania HEVC w kolejności mojej rekomendacji:

  • Bezpośrednio za pomocą MulticoreWare libx265 z FFmpeg. Oznacza to, że dzięki najnowszej wersji Zeranoe możesz teraz to zrobić:

    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
    

    Uwaga: kompilacje FFmpeg nowsze niż 2014-03-09 pozwalają teraz na multipleksowanie HEVC w plikach .mp4 (zatwierdzenie 9563e67):

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

    Możesz także multipleksować w Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Używanie samodzielnego MulticoreWare x265, a następnie multipleksowanie powstałego pliku za pomocą FFmpeg lub MP4Box . Będzie to działać ze starszymi kompilacjami FFmpeg, które nie obsługują 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
    

    Dzięki @Duvrai.

  • Za pomocą enkodera DivX HEVC, a następnie multipleksować.

    Sposób korzystania z niego jest podobny do korzystania z samodzielnego x265 (patrz wyżej).

Aktualizacja: FFmpeg obsługuje teraz kodowanie HEVC za pomocą MulticoreWare libx265.

Aktualizacja 2: FFmpeg obsługuje teraz multipleksowanie HEVC do mp4 ORAZ mov.

Timothy Gu
źródło
1
Dla tych, którzy nie wiedzą, co to crf=25reprezentuje w przykładowych poleceniach, oto przewodnik CRF: slhck.info/articles/crf
Programster
Aby wyjaśnić komentarz @ Programster, link prowadzi do przewodnika x264, ale x265 i x264 są bardzo podobne w wyborze CRF.
Timothy Gu
Nie mogłem znaleźć żadnego przewodnika po CRF specjalnie dla h265, ale koncepcja wygląda na stałą. Obecnie eksperymentuję z zalecanymi przez siebie wartościami (18–28), ale nie wiem, czy muszą się one nieco różnić w przypadku h265.
Programster
@Programster: Tak, zakres x265 wynosi 0-51 . Jednak domyślna wartość to 28 zamiast 23.
Timothy Gu
2
Świetna odpowiedź ogólnie, ale brakuje krytycznego fragmentu; -c:v libx265tak jak jest, powyższe przykłady generują przy użyciu x264. Dla jasności kodowałem za ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4pomocą x264, ale ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4kodowałem za pomocą x265.
rainabba
18

ffmpeg dodało kodowanie x265 12 lutego 2014 r. i obsługę kontenerów mp4 9 marca:

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

Uwaga:

  • Powyższe polecenie skopiuje dźwięk do oryginalnego kodeka. Jeśli to nie działa, konwersja audio do formatu AAC przez pominięcie -c:a copy(lub wymienić copyz aac, libfdk_aaclub libfaac- nakazał jakości-wise)
  • podczas kompilacji użyj ffmpeg --enable-libx265(i --enable-libfdk-aaclub w --enable-libfaacrazie potrzeby)
Duvrai
źródło
1
FFmpeg obsługuje multipleksowanie HEVC natywnie w mp4 od 3-9-2014.
Timothy Gu
1
Z jakiegoś powodu wynik był zielony i różowy, ale kiedy dodałem -pix_fmt yuv420pprzed -c:v, wynik był w porządku.
Evgeni Sergeev