¿Cómo generar un MP4 con códec H.265 usando FFmpeg?

24

Quiero codificar un archivo de video a H.265. La última versión de ffmpeg debe ser compatible con H.265 ( Fuente ).

Sin embargo, no pude encontrar ninguna información sobre el comando exacto.

No sé, qué biblioteca debo indicar después -vcodec.

Yo uso la última Zeranoe FFmpeg Build (git-c78a416 (2013-10-26)).

skull3r7
fuente

Respuestas:

40

Fondo

FFmpeg admite la codificación HEVC / H.265 desde 2014-2-12 con libx265. Ahora puede usar ffmpeg directamente para codificar HEVC o usar otro codificador y luego muxearlo manualmente en .mp4, .mov o .mkv usando FFmpeg.

Codificadores disponibles

Los codificadores actuales H.265 / HEVC son:

Solo se sugieren MulticoreWare y DivX debido a su tiempo de desarrollo y confiabilidad.

Dos x265

Una confusión es que hay dos proyectos independientes, ambos llamados "x265", uno por un estudiante universitario chino y está prácticamente muerto, y otro por una compañía comercial llamada MulticoreWare. Aunque el primero comenzó primero, está prácticamente muerto ahora, y el segundo está en desarrollo activo y cuenta con el respaldo de VideoLAN (el desarrollador de x264).

Cronología del soporte de codificación FFmpeg HEVC

  • 2013-10-12 .mov muxing soporte agregado en 53f903b.
  • 2014-02-12 Soporte de codificación libx265 agregado en bb6b173.
  • 2014-03-09 Se agregó un soporte de muxing Matroska más completo para HEVC 38aee64.
  • 2014-03-09 Más completo .mov y nuevo soporte de muxing .mp4 agregado 9563e67.

tl; dr

De todos modos, estos son un conjunto completo de posibilidades actuales de codificar HEVC en el orden de mi recomendación:

  • Directamente utilizando MulticoreWare libx265 con FFmpeg. Esto significa que con la última versión de Zeranoe ahora puedes hacer esto:

    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: Las compilaciones de FFmpeg más recientes que 2014-03-09 le permiten mux HEVC en archivos .mp4 ahora (commit 9563e67):

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

    También puede enviarlo en Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Usando MulticoreWare x265 independiente y luego mux el archivo resultante con FFmpeg o MP4Box . Esto funcionará con versiones anteriores de FFmpeg que no tienen soporte para 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
    

    Gracias a @Duvrai.

  • Usando DivX HEVC Encoder y luego mux.

    La forma de usarlo es similar a usar x265 independiente (ver arriba).

Actualización: FFmpeg tiene soporte de codificación HEVC usando MulticoreWare libx265 ahora.

Actualización 2: FFmpeg ahora tiene soporte para mezclar HEVC en mp4 y mov ahora.

Timothy Gu
fuente
1
Para aquellos que no saben lo que crf=25representa en los comandos de ejemplo, aquí hay una guía de CRF: slhck.info/articles/crf
Programster
Para aclarar el comentario de @ Programster, el enlace va a una guía x264, pero x265 y x264 son muy similares en la selección de CRF.
Timothy Gu
No pude encontrar ninguna guía sobre CRF específicamente dirigida a h265, pero el concepto parece constante. Actualmente estoy experimentando con los valores que recomienda (18-28), pero no sé si estos deben ser ligeramente diferentes para h265.
Programador
@Programador: Sí, el rango de x265 es 0-51 . Sin embargo, el valor predeterminado es 28 en lugar de 23.
Timothy Gu
2
Gran respuesta en general, pero falta un poco crítico; -c:v libx265tal como está, los ejemplos anteriores salen usando x264. Para mayor claridad, ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4estaba codificando con x264, pero ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4codificado con x265.
rainabba
18

ffmpeg agregó codificación x265 el 12 de febrero de 2014 y compatibilidad con contenedores mp4 el 9 de marzo:

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

Nota:

  • El comando anterior copiará el audio en su códec original. Si eso no funciona, convertir el audio a AAC omitiendo -c:a copy(o sustituir copycon aac, libfdk_aaco libfaac- ordenado en cuanto a calidad)
  • al compilar uso ffmpeg --enable-libx265(y --enable-libfdk-aac, o --enable-libfaacsi es necesario)
Duvrai
fuente
1
FFmpeg es compatible con muxing HEVC de forma nativa en mp4 desde el 9/3/2014.
Timothy Gu
1
Por alguna razón, el resultado fue verde y rosa, pero cuando agregué -pix_fmt yuv420pantes -c:v, el resultado fue bueno.
Evgeni Sergeev