Bagaimana cara menghasilkan MP4 dengan codec H.265 menggunakan FFmpeg?

24

Saya ingin menyandikan file video ke H.265. Versi terakhir dari ffmpeg harus mendukung H.265 ( Sumber ).

Namun, saya tidak dapat menemukan informasi tentang perintah yang tepat.

Saya tidak tahu, perpustakaan mana yang harus saya tunjukkan setelahnya -vcodec.

Saya menggunakan Zeranoe FFmpeg Build terbaru (git-c78a416 (2013-10-26)).

skull3r7
sumber

Jawaban:

40

Latar Belakang

FFmpeg mendukung penyandian HEVC / H.265 sejak 2014-2-12 dengan libx265. Sekarang Anda dapat menggunakan ffmpeg secara langsung untuk menyandikan HEVC atau menggunakan enkoder lain lalu secara manual mux itu menjadi .mp4, .mov, atau .mkv menggunakan FFmpeg.

Encoders yang tersedia

Enkoder H.265 / HEVC saat ini adalah:

Hanya MulticoreWare dan DivX yang disarankan karena waktu pengembangan dan keandalannya.

Dua x265

Satu kebingungan adalah bahwa ada dua proyek independen yang keduanya bernama "x265", satu oleh seorang mahasiswa Cina dan praktis sudah mati, dan yang lainnya oleh perusahaan komersial bernama MulticoreWare. Meskipun yang pertama dimulai lebih dulu, secara praktis sudah mati sekarang, dan yang terakhir sedang dalam pengembangan aktif dan didukung oleh VideoLAN (pengembang x264).

Garis Waktu Dukungan Encoding FFmpeg HEVC

  • 2013-10-12 .mov dukungan muxing ditambahkan 53f903b.
  • Dukungan penyandian libx265 2014-02-12 ditambahkan bb6b173.
  • 2014-03-09 Dukungan muxing Matroska yang lebih lengkap untuk HEVC ditambahkan 38aee64.
  • 2014-03-09 Lebih lengkap .mov dan .mp4 dukungan muxing baru ditambahkan 9563e67.

tl; dr

Bagaimanapun, ini adalah set lengkap kemungkinan saat ini pengkodean HEVC dalam rangka rekomendasi saya:

  • Langsung menggunakan MulticoreWare libx265 dengan FFmpeg. Ini berarti dengan Zeranoe build terbaru Anda sekarang dapat melakukan ini:

    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
    

    Catatan: FFmpeg build yang lebih baru dari 2014-03-09 memungkinkan Anda untuk mux HEVC ke file .mp4 sekarang (komit 9563e67):

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

    Anda juga dapat mux di Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Menggunakan MulticoreWare x265 mandiri dan kemudian mux file yang dihasilkan dengan FFmpeg atau MP4Box . Ini akan berfungsi dengan FFmpeg build lama yang tidak memiliki dukungan 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
    

    Terima kasih untuk @Duvrai.

  • Menggunakan DivX HEVC Encoder dan kemudian mux.

    Cara menggunakannya mirip dengan menggunakan x265 mandiri (lihat di atas).

Pembaruan: FFmpeg memiliki dukungan pengkodean HEVC menggunakan libx265 MulticoreWare sekarang.

Pembaruan 2: FFmpeg sekarang memiliki dukungan untuk muxing HEVC ke mp4 DAN mov sekarang.

Timothy Gu
sumber
1
Bagi mereka yang tidak tahu apa yang crf=25diwakilinya dalam contoh perintah, berikut ini adalah panduan CRF: slhck.info/articles/crf
Programster
Untuk mengklarifikasi komentar @ Programster, tautan menuju ke panduan x264, tetapi x265 dan x264 sangat mirip dalam pemilihan CRF.
Timothy Gu
Saya tidak dapat menemukan panduan tentang CRF yang khusus ditujukan untuk H265 tetapi konsepnya terlihat konstan. Saya saat ini bereksperimen dengan nilai-nilai yang direkomendasikan (18-28), tetapi tidak tahu apakah ini harus sedikit berbeda untuk H265.
Programster
@Programster: Ya kisaran x265 adalah 0-51 . Namun nilai default adalah 28 bukan 23.
Timothy Gu
2
Jawabannya bagus secara keseluruhan, tetapi sedikit hilang kritis; -c:v libx265sebagaimana adanya, contoh-contoh di atas keluaran menggunakan x264. Untuk kejelasan, ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4dikodekan dengan x264, tetapi ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4dikodekan dengan x265.
rainabba
18

ffmpeg menambahkan x265 encoding pada 12 Februari 2014, dan dukungan wadah mp4 pada 9 Maret:

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

catatan:

  • Perintah di atas akan menyalin audio dalam codec aslinya. Jika itu tidak berhasil, konversikan audio ke AAC dengan menghilangkan -c:a copy(atau mengganti copydengan aac, libfdk_aacatau libfaac- memesan berdasarkan kualitas)
  • saat mengkompilasi penggunaan ffmpeg --enable-libx265(dan --enable-libfdk-aacatau --enable-libfaacjika perlu)
Duvrai
sumber
1
FFmpeg mendukung muxing HEVC secara asli dalam mp4 sejak 3-9-2014.
Timothy Gu
1
Entah mengapa hasilnya hijau dan merah muda, tetapi ketika saya menambahkan -pix_fmt yuv420psebelum -c:v, hasilnya baik-baik saja.
Evgeni Sergeev