Comment générer un MP4 avec le codec H.265 en utilisant FFmpeg?

24

Je veux encoder un fichier vidéo en H.265. La dernière version de ffmpeg devrait être prise en charge H.265 ( Source ).

Cependant, je n'ai trouvé aucune information sur la commande exacte.

Je ne sais pas quelle bibliothèque je dois indiquer après -vcodec.

J'utilise la dernière version de Zeranoe FFmpeg (git-c78a416 (2013-10-26)).

skull3r7
la source

Réponses:

40

Contexte

FFmpeg prend en charge l'encodage HEVC / H.265 depuis le 2014-2-12 avec libx265. Vous pouvez maintenant utiliser ffmpeg directement pour encoder HEVC ou utiliser un autre encodeur, puis le multiplexer manuellement dans .mp4, .mov ou .mkv à l'aide de FFmpeg.

Encodeurs disponibles

Les codeurs H.265 / HEVC actuels sont:

Seuls le MulticoreWare et le DivX sont suggérés en raison de leur temps de développement et de leur fiabilité.

Deux x265

Une confusion est qu'il y a deux projets indépendants nommés "x265", l'un par un étudiant chinois et est pratiquement mort, et l'autre par une société commerciale appelée MulticoreWare. Bien que le premier ait commencé en premier, il est pratiquement mort maintenant, et le second est en développement actif et est approuvé par VideoLAN (le développeur de x264).

Chronologie de la prise en charge de l'encodage FFmpeg HEVC

  • 2013-10-12 Ajout de la prise en charge du multiplexage .mov 53f903b.
  • 2014-02-12 Prise en charge du codage libx265 ajoutée bb6b173.
  • 2014-03-09 Ajout d'un support de multiplexage Matroska plus complet pour HEVC 38aee64.
  • 09/03/2014 Un support .mov plus complet et un nouveau support de multiplexage .mp4 ajoutés 9563e67.

tl; dr

Quoi qu'il en soit, ce sont un ensemble complet de possibilités actuelles d'encodage HEVC dans l'ordre de ma recommandation:

  • Utilisation directe de MulticoreWare libx265 avec FFmpeg. Cela signifie qu'avec la dernière version de Zeranoe, vous pouvez maintenant le faire:

    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
    

    Remarque: FFmpeg construit plus récent que 2014-03-09 vous permet de muxer HEVC dans des fichiers .mp4 maintenant (commit 9563e67):

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

    Vous pouvez également le multiplexer dans Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Utilisation de MulticoreWare x265 autonome, puis multiplexer le fichier résultant avec FFmpeg ou MP4Box . Cela fonctionnera avec les anciennes versions de FFmpeg qui ne prennent pas en charge 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
    

    Merci à @Duvrai.

  • Utilisation de DivX HEVC Encoder puis multiplexage.

    La façon de l'utiliser est similaire à l'utilisation de x265 autonome (voir ci-dessus).

Mise à jour: FFmpeg prend désormais en charge le codage HEVC en utilisant MulticoreWare libx265.

Mise à jour 2: FFmpeg prend désormais en charge le multiplexage HEVC dans mp4 ET mov maintenant.

Timothy Gu
la source
1
Pour ceux qui ne savent pas ce que le crf=25représente dans les commandes d'exemple, voici un guide CRF: slhck.info/articles/crf
Programster
Pour clarifier le commentaire de @ Programster, le lien va vers un guide x264, mais x265 et x264 sont très similaires dans la sélection CRF.
Timothy Gu
Je n'ai trouvé aucun guide sur le CRF spécifiquement destiné au h265 mais le concept semble constant. J'expérimente actuellement avec les valeurs qu'il recommande (18-28), mais je ne sais pas si elles doivent être légèrement différentes pour h265.
Programster
@Programster: Oui, la plage de x265 est 0-51 . Cependant la valeur par défaut est 28 au lieu de 23.
Timothy Gu
2
Excellente réponse dans l'ensemble, mais il manque un élément critique; -c:v libx265en l'état, les exemples ci-dessus sortent en utilisant x264. Pour plus de clarté, codait avec ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4x264, mais ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4codé avec x265.
rainabba
18

ffmpeg a ajouté l'encodage x265 le 12 février 2014 et la prise en charge des conteneurs mp4 le 9 mars:

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

Remarque:

  • La commande ci-dessus copiera l'audio dans son codec d'origine. Si cela ne fonctionne pas, convertissez l'audio en AAC en omettant -c:a copy(ou remplacez copypar aac, libfdk_aacou libfaac- en fonction de la qualité)
  • lors de la compilation de ffmpeg --enable-libx265(et --enable-libfdk-aacou --enable-libfaacsi nécessaire)
Duvrai
la source
1
FFmpeg prend en charge le multiplexage HEVC natif dans mp4 depuis le 3-9-2014.
Timothy Gu
1
Pour une raison quelconque, le résultat était vert et rose, mais quand j'ai ajouté -pix_fmt yuv420pavant le -c:v, le résultat était bien.
Evgeni Sergeev