Come generare un MP4 con codec H.265 utilizzando FFmpeg?


24

Voglio codificare un file video su H.265. L'ultima versione di ffmpeg dovrebbe supportare H.265 ( sorgente ).

Tuttavia, non sono riuscito a trovare alcuna informazione sul comando esatto.

Non so quale libreria dovrei indicare dopo -vcodec.

Uso l'ultimo Zeranoe FFmpeg Build (git-c78a416 (26-10-2013)).

Risposte:


40

sfondo

FFmpeg supporta la codifica HEVC / H.265 dal 2014-2-12 con libx265. Ora puoi usare ffmpeg direttamente per codificare HEVC o usare un altro codificatore e poi combinarlo manualmente in .mp4, .mov o .mkv usando FFmpeg.

Encoder disponibili

Gli attuali encoder H.265 / HEVC sono:

Solo MulticoreWare e DivX sono suggeriti per il loro tempo di sviluppo e affidabilità.

Due x265

Una confusione è che ci sono due progetti indipendenti entrambi chiamati "x265", uno di uno studente cinese e praticamente morto, e un altro di una società commerciale chiamata MulticoreWare. Sebbene il primo sia iniziato prima, ora è praticamente morto e il secondo è in fase di sviluppo attivo ed è supportato da VideoLAN (lo sviluppatore di x264).

Cronologia del supporto per la codifica HEVC di FFmpeg

  • 12/10/2013 53f903b. Aggiunto il supporto per il muxing .mov .
  • 12/02/2014 è stato aggiunto il supporto per la codifica libx265 bb6b173.
  • 09/03/2014 Aggiunto il supporto più completo per il muxing Matroska per HEVC 38aee64.
  • 09/03/2014 Aggiunto supporto più completo per .mov e nuovo .mp4 muxing 9563e67.

tl; dr

Ad ogni modo, queste sono una serie completa delle attuali possibilità di codificare HEVC in base alla mia raccomandazione:

  • Utilizzo diretto di MulticoreWare libx265 con FFmpeg. Ciò significa che con l'ultima build di Zeranoe ora puoi farlo:

    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
    

    Nota: FFmpeg crea una versione più recente rispetto al 09-03-2014 che consente di convertire HEVC in file .mp4 ora (commit 9563e67):

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

    Puoi anche combinarlo in Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Utilizzando MulticoreWare standalone x265 e quindi mux il file risultante con FFmpeg o MP4Box . Funzionerà con build FFmpeg precedenti che non hanno il supporto 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
    

    Grazie a @Duvrai.

  • Usando DivX HEVC Encoder e poi combinalo.

    Il modo di usarlo è simile all'utilizzo di x265 standalone (vedi sopra).

Aggiornamento: FFmpeg ha ora il supporto per la codifica HEVC usando MulticoreWare libx265.

Aggiornamento 2: FFmpeg ora supporta ora il muxing HEVC in mp4 AND mov.


1
Per coloro che non sanno cosa crf=25rappresenta nei comandi di esempio, ecco una guida CRF: slhck.info/articles/crf
Programster

Per chiarire il commento di @ Programster, il collegamento va a una guida x264, ma x265 e x264 sono molto simili nella selezione CRF.
Timothy Gu,

Non sono riuscito a trovare alcuna guida su CRF specificamente rivolta a h265 ma il concetto sembra costante. Attualmente sto sperimentando i valori che raccomanda (18-28), ma non so se questi debbano essere leggermente diversi per h265.
Programmatore

@Programster: Sì, l'intervallo di x265 è 0-51 . Tuttavia, il valore predefinito è 28 anziché 23.
Timothy Gu,

2
Ottima risposta nel complesso, ma manca un po 'critico; -c:v libx265così com'è, gli esempi sopra vengono visualizzati usando x264. Per chiarezza, ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4stava codificando con x264, ma ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4codificato con x265.
Rainabba,

18

ffmpeg ha aggiunto la codifica x265 il 12 febbraio 2014 e il supporto del contenitore mp4 il 9 marzo:

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

Nota:

  • Il comando sopra copierà l'audio nel suo codec originale. Se non funziona, converti l'audio in AAC omettendo -c:a copy(o sostituendolo copycon aac, libfdk_aaco libfaac- ordinato in termini di qualità)
  • durante la compilazione di ffmpeg usare --enable-libx265(e --enable-libfdk-aaco --enable-libfaacse necessario)

1
FFmpeg supporta il muxing HEVC nativamente in mp4 dal 3-9-2014.
Timothy Gu,

1
Per qualche motivo il risultato è stato verde e rosa, ma quando l'ho aggiunto -pix_fmt yuv420pprima del -c:v, il risultato andava bene.
Evgeni Sergeev,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.