Wie kann ich mit FFmpeg einen MP4 mit H.265-Codec erzeugen?

24

Ich möchte eine Videodatei nach H.265 kodieren. Die letzte Version von ffmpeg sollte H.265 ( Source ) unterstützen.

Ich konnte jedoch keine Informationen über den genauen Befehl finden.

Ich weiß nicht, welche Bibliothek ich danach angeben soll -vcodec.

Ich benutze den neuesten Zeranoe FFmpeg Build (git-c78a416 (2013-10-26)).

skull3r7
quelle

Antworten:

40

Hintergrund

FFmpeg unterstützt die Codierung von HEVC / H.265 seit dem 12.02.2014 mit libx265. Jetzt können Sie ffmpeg direkt zum Codieren von HEVC verwenden oder einen anderen Encoder verwenden und diesen dann mithilfe von FFmpeg manuell in .mp4, .mov oder .mkv muxen.

Verfügbare Encoder

Aktuelle H.265 / HEVC-Encoder sind:

Aufgrund ihrer Entwicklungszeit und Zuverlässigkeit werden nur MulticoreWare und DivX empfohlen.

Zwei x265

Eine Verwirrung ist, dass es zwei unabhängige Projekte mit dem Namen "x265" gibt, eines von einem chinesischen College-Studenten, der praktisch tot ist, und eines von einer kommerziellen Firma namens MulticoreWare. Obwohl die erste Version als erste gestartet wurde, ist sie jetzt praktisch tot, und die zweite befindet sich in der aktiven Entwicklung und wird von VideoLAN (dem Entwickler von x264) unterstützt.

Zeitleiste der FFmpeg-HEVC-Codierungsunterstützung

  • 2013-10-12 .mov Muxing-Unterstützung hinzugefügt in 53f903b.
  • 2014-02-12 libx265 Kodierungsunterstützung hinzugefügt in bb6b173.
  • 2014-03-09 Vollständigere Matroska-Muxing-Unterstützung für HEVC hinzugefügt in 38aee64.
  • 2014-03-09 Vollständigere .mov- und neue .mp4-Muxing-Unterstützung hinzugefügt in 9563e67.

tl; dr

Wie auch immer, dies ist ein vollständiger Satz aktueller Möglichkeiten zur Codierung von HEVC in der Reihenfolge meiner Empfehlung:

  • Direktes Verwenden von MulticoreWare libx265 mit FFmpeg. Dies bedeutet, dass Sie mit dem neuesten Zeranoe-Build Folgendes tun können:

    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
    

    Hinweis: Mit FFmpeg-Builds, die neuer als der 09.03.2014 sind, können Sie HEVC jetzt in MP4-Dateien muxen (Commit 9563e67):

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

    Sie können es auch in Matroska (.mkv) muxen:

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Verwenden Sie Standalone-MulticoreWare x265 und muxen Sie die resultierende Datei mit FFmpeg oder MP4Box . Dies funktioniert mit älteren FFmpeg-Builds, die libx265 nicht unterstützen.

    # 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
    

    Vielen Dank an @Duvrai.

  • Mit DivX HEVC Encoder und dann muxen.

    Die Verwendung ähnelt der Verwendung von Standalone x265 (siehe oben).

Update: FFmpeg unterstützt jetzt die HEVC-Codierung mit MulticoreWare libx265.

Update 2: FFmpeg unterstützt jetzt das Muxen von HEVC in mp4 AND mov.

Timothy Gu
quelle
1
Für diejenigen, die nicht wissen, was crf=25in den Beispielbefehlen dargestellt wird, finden Sie hier einen CRF-Leitfaden: slhck.info/articles/crf
Programster
Um den Kommentar von @ Programster zu verdeutlichen, wird auf eine x264-Anleitung verwiesen, aber x265 und x264 sind in der CRF-Auswahl sehr ähnlich.
Timothy Gu
Ich konnte keine Anleitung zu CRF speziell für h265 finden, aber das Konzept sieht konstant aus. Ich experimentiere derzeit mit den empfohlenen Werten (18-28), weiß aber nicht, ob diese für h265 geringfügig abweichen müssen.
Programster
@Programster: Ja, der x265-Bereich liegt zwischen 0 und 51 . Der Standardwert ist jedoch 28 statt 23.
Timothy Gu
2
Insgesamt eine großartige Antwort, aber es fehlt ein kritischer Teil. -c:v libx265So wie es ist, werden die obigen Beispiele unter Verwendung von x264 ausgegeben. Der Übersichtlichkeit ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4halber wurde mit x264, aber ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4mit x265 codiert.
Rainabba
18

ffmpeg hat am 12. Februar 2014 die x265-Codierung und am 9. März die MP4-Container-Unterstützung hinzugefügt:

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

Hinweis:

  • Der obige Befehl kopiert das Audio im Original-Codec. Wenn das nicht funktioniert, konvertieren die Audio - AAC durch Weglassen -c:a copy(oder ersetzen copymit aac, libfdk_aacoder libfaac- bestellte Qualität her)
  • beim kompilieren von ffmpeg benutzen --enable-libx265(und --enable-libfdk-aacoder --enable-libfaacfalls nötig)
Duvrai
quelle
1
FFmpeg unterstützt seit dem 3.9.2014 das native Muxen von HEVC in mp4.
Timothy Gu
1
Aus irgendeinem Grund war das Ergebnis grün und pink, aber als ich -pix_fmt yuv420pvor dem hinzufügte -c:v, war das Ergebnis in Ordnung.
Evgeni Sergeev