Como gerar um MP4 com codec H.265 usando FFmpeg?

24

Eu quero codificar um arquivo de vídeo para H.265. A última versão do ffmpeg deve ser o suporte ao H.265 ( origem ).

No entanto, não foi possível encontrar nenhuma informação sobre o comando exato.

Não sei qual biblioteca devo indicar depois -vcodec.

Eu uso o último Zeranoe FFmpeg Build (git-c78a416 (2013-10-26)).

skull3r7
fonte

Respostas:

40

fundo

O FFmpeg suporta a codificação HEVC / H.265 desde 12/12/2014 com libx265. Agora você pode usar o ffmpeg diretamente para codificar o HEVC ou usar outro codificador e depois agrupá-lo manualmente em .mp4, .mov ou .mkv usando o FFmpeg.

Codificadores disponíveis

Os codificadores atuais H.265 / HEVC são:

Somente o MulticoreWare e o DivX são sugeridos devido ao seu tempo de desenvolvimento e confiabilidade.

Dois x265

Uma confusão é que existem dois projetos independentes, ambos denominados "x265", um por um estudante chinês e praticamente morto, e outro por uma empresa comercial chamada MulticoreWare. Embora o primeiro tenha começado primeiro, ele está praticamente morto agora, e o último está em desenvolvimento ativo e é endossado pelo VideoLAN (o desenvolvedor do x264).

Linha do tempo do suporte à codificação FFmpeg HEVC

  • 2013-10-12 suporte ao .mov muxing adicionado 53f903b.
  • 12-02-2014 adicionado suporte à codificação libx265 bb6b173.
  • 2014-03-09 Foi adicionado um suporte mais completo ao Matroska muxing para HEVC 38aee64.
  • 2014-03-09 Mais completo suporte ao .mov e ao novo .mp4 muxing 9563e67.

tl; dr

De qualquer forma, este é um conjunto completo de possibilidades atuais de codificação de HEVC na ordem da minha recomendação:

  • Diretamente usando o MulticoreWare libx265 com FFmpeg. Isso significa que, com a versão mais recente do Zeranoe, agora você pode fazer isso:

    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: As compilações do FFmpeg mais recentes que 09/03/2014 permitem que você mux o HEVC em arquivos .mp4 agora (confirmar 9563e67):

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

    Você também pode compactá-lo em Matroska (.mkv):

    ffmpeg -i INPUT -c:v libx265 -an -x265-params crf=25 OUT.mkv
    
  • Usando o MulticoreWare x265 autônomo e depois mux o arquivo resultante com o FFmpeg ou o MP4Box . Isso funcionará com versões mais antigas do FFmpeg que não têm suporte à 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
    

    Graças a @Duvrai.

  • Usando o codificador DivX HEVC e mux.

    A maneira de usá-lo é semelhante ao uso do x265 autônomo (veja acima).

Atualização: O FFmpeg agora possui suporte à codificação HEVC usando o MulticoreWare libx265.

Atualização 2: O FFmpeg agora tem suporte para colocar o HEVC em mux no mp4 AND mov agora.

Timothy Gu
fonte
1
Para aqueles que não sabem o que o crf=25representa nos comandos exemplo, aqui está um guia CRF: slhck.info/articles/crf
Programster
Para esclarecer o comentário do @ Programster, o link vai para um guia x264, mas x265 e x264 são muito semelhantes na seleção do CRF.
Timothy Gu
Não consegui encontrar nenhum guia sobre CRF especificamente voltado para o h265, mas o conceito parece constante. Atualmente, estou experimentando os valores recomendados (18-28), mas não sei se esses precisam ser ligeiramente diferentes para o h265.
Programster
@Programster: gama de Sim X265 é 0-51 . No entanto valor padrão é 28 em vez de 23.
Timothy Gu
2
Ótima resposta no geral, mas falta um pouco crítico; -c:v libx265como estão, os exemplos acima são impressos usando x264. Para maior clareza, ffmpeg -i INPUT -c:a copy -x265-params crf=2 OUTPUT_h265.mp4foi codificado com x264, mas ffmpeg -i INPUT -c:v libx265 -c:a copy -x265-params crf=2 OUTPUT_h265.mp4codificado com x265.
Rainabba
18

ffmpeg adicionou codificação x265 em 12 de fevereiro de 2014 e suporte a contêiner mp4 em 9 de março:

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

Nota:

  • O comando acima copiará o áudio em seu codec original. Se isso não funcionar, converta o áudio em AAC, omitindo -c:a copy(ou substituindo copypor aac, libfdk_aacou libfaac- pedido com qualidade)
  • ao compilar o uso do ffmpeg --enable-libx265(e --enable-libfdk-aacou --enable-libfaacse necessário)
Duvrai
fonte
1
O FFmpeg suporta muxing HEVC nativamente no mp4 desde 9/3 a 2014.
Timothy Gu
1
Por alguma razão, o resultado foi verde e rosa, mas, quando adicionei -pix_fmt yuv420pantes -c:v, o resultado foi bom.
Evgeni Sergeev 28/07