[Processamento de áudio e vídeo] transcodificação H264 para H265, FFmpeg, explicação sobre compartilhamento de código

Olá a todos e sejam bem-vindos ao canal Stop Refactoring.

Nesta edição, discutimos a transcodificação de arquivos de áudio e vídeo , como a conversão de vídeo H264 em H265, etc.

O código mencionado no conteúdo será colocado no GitHub , amigos interessados ​​​​podem acessar o GitHub para fazer o download.

Discutimos nesta ordem:​

1. O papel da codificação 

2. O princípio de funcionamento da transcodificação

3. Instalação do codec 

4. Exemplo de explicação de código 

O papel da codificação

Conforme discutido nos "Princípios de funcionamento de transcodificação de áudio e vídeo" anteriores, um arquivo de vídeo é essencialmente dividido em três camadas : encapsulamento, codificação e dados básicos .

A função da codificação é compactar os dados e limitar o tamanho do arquivo final.

Escolher diferentes formatos de codificação é mais para economizar mais espaço de armazenamento ou para expandir a compatibilidade de reprodução do cliente .

Vale a pena mencionar aqui que a codificação precisa distinguir entre áudio e vídeo, e os codificadores de vídeo não podem compactar dados de áudio e vice-versa.

 

Para uma descrição detalhada dos formatos de codificação de vídeo como H264, consulte a edição anterior de "H264".

 

Para uma descrição detalhada dos formatos de codificação de áudio, como AAC, consulte a edição anterior da "AAC"

Como funciona a transcodificação 

Todo o processo de transcodificação é  decapsulation>>decoding>>encoding>>encapsulation .

Coloque o bloco de dados descapsulado no decodificador correspondente e ele pode ser descompactado no quadro de vídeo e no quadro de áudio originais.

Coloque o quadro original no codificador de destino para compactar o bloco de dados do formato de codificação correspondente.

Um dos blocos de dados não é necessariamente um quadro completo de dados. Para alguns formatos de encapsulamento, vários blocos de dados podem formar um quadro completo de dados.

Todo o processo é transmitido e iterado até que o processamento seja concluído.

O que precisa ser especialmente explicado aqui é que tanto o codificador quanto o decodificador correspondem ao formato de codificação , são programas de algoritmos específicos e estão prontos para uso .

Por exemplo, se h264 for convertido em h265, o decodificador usará h264 e o codificador usará h265.

Se for uma cena de transmissão ao vivo, você pode optar por adicionar um intervalo de tempo antes do empacotamento. Consulte a edição anterior de "Reembalagem", e não vou repetir nesta edição.

Como observação complementar, a transcodificação é, na verdade, apenas um formato de codificação diferente . Você pode definir parâmetros como a taxa de bits que afetam a eficiência da compactação do codificador e também pode definir parâmetros específicos para o formato de codificação , como a remoção de quadros B.

No entanto, se você quiser alterar parâmetros como resolução, taxa de quadros e taxa de amostragem , precisará processar os dados do quadro original . Para obter instruções detalhadas sobre esta parte, preste atenção ao próximo problema.

 

instalação de codec

O FFmpeg inclui alguns codecs por padrão, você pode usar o comando para visualizar os codecs suportados pelo FFmpeg.

Se você precisar estender o codec para FFmpeg , será necessário instalar primeiro o programa codificador/decodificador correspondente, depois modificar a configuração de compilação do FFmpeg, recompilar e instalar.

Para uma descrição mais detalhada do FFmpeg, consulte a edição anterior do "FFmpeg".

 

Explicação de código de exemplo 

O código de amostra de transcodificação é trancode.cpp e o código de amostra é H264 a H265.

Com base no código de amostra de transcapsulação original , os codecs inicial e fechado são adicionados e os processos de decodificação e codificação são adicionados aos dados de processamento do loop .

Ao definir a base de tempo do decodificador/codificador, o FFmpeg recomenda configurá-lo para o recíproco da taxa de quadros, mas de acordo com nossa experiência, haverá muitos problemas, por isso recomendamos configurá-lo para uma base de tempo unificada .

 

Durante o processo de transcodificação, a conversão da base de tempo precisa ser feita antes da decodificação e depois da codificação  para garantir que a reprodução do vídeo não seja muito rápida ou muito lenta.

 

Ao codificar/decodificar, é necessário distinguir áudio/vídeo e colocar os dados no codec correspondente .

Além disso, a codificação/decodificação é de natureza assíncrona , portanto, o programa precisa avaliar se deve buscar os dados antes de prosseguir para a próxima etapa.

 

E devido ao processamento assíncrono do codec, e a decodificação leva um certo tempo, quando o arquivo de vídeo é lido , o codec ainda pode ter dados não processados .

Portanto, após a leitura do arquivo de vídeo, é necessário aguardar que o codec processe todos os dados antes que o processamento seja concluído.

Resumir

O código deste problema foi carregado no Github e amigos que precisarem dele podem baixá-lo.

A explicação do código acima menciona apenas as partes importantes. O código contém anotações mais detalhadas, incluindo instruções para construir o ambiente de compilação e execução, e também fornece um contêiner docker pronto.

Acho que você gosta

Origin blog.csdn.net/Daniel_Leung/article/details/132450023
Recomendado
Clasificación