Processo de codificação de vídeo Os dados YUV são codificados em dados H264

1. Processo de codificação de vídeo

Insira a descrição da imagem aqui

2. Demonstração prática

#ifndef MAINBACK_C
#define MAINBACK_C
#endif // MAINBACK_C
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavutil/common.h>
#include <libavutil/frame.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
#include <time.h>
int encode(AVCodecContext* codec_ctx,AVFrame* frame,AVPacket* pkt,FILE* out)
{
    
    
    int ret=0;
    ret = avcodec_send_frame(codec_ctx,frame);
    printf("send data\n");
    if(ret<0){
    
    
        printf("avcodec_send_frame failed\n");
        return ret;
    }

    while(1)
    {
    
    
        ret=avcodec_receive_packet(codec_ctx,pkt);
        if(ret==AVERROR(EAGAIN)||ret==AVERROR(AVERROR_EOF))
            break;
        if(ret<0)return ret;
        printf("write data\n");
        fwrite(pkt->data,1,pkt->size,out);

    }

}
//编码流程  先初始化编码器,读取原始文件,send,recvice,写入
int main(int argc,char* argv[])
{
    
    
    if(argv<3)
    {
    
    
        printf("argv<3\n");
        return -1;
    }
    char* yuv_path=argv[1];
    char* out_path=argv[2];
    FILE* yuv_file=fopen(yuv_path,"rb");
    FILE* out_file=fopen(out_path,"wb");
    AVCodec* codec=avcodec_find_encoder(AV_CODEC_ID_H264);
    AVCodecContext* codec_ctx=avcodec_alloc_context3(codec);

    codec_ctx->bit_rate=1024*512;
    codec_ctx->width=768;
    codec_ctx->height=320;
    codec_ctx->pix_fmt=AV_PIX_FMT_YUV420P;
    codec_ctx->max_b_frames=0;
    codec_ctx->gop_size=25;
    codec_ctx->framerate=(AVRational){
    
    25,1};
    codec_ctx->time_base=(AVRational){
    
    1,25};
    av_opt_set(codec_ctx->priv_data,"preset","veryslow",0);
    av_opt_set(codec_ctx->priv_data,"profile","main",0);
    av_opt_set(codec_ctx->priv_data,"tune","zerolatency",0);
    avcodec_open2(codec_ctx,codec,NULL);
    AVFrame* frame=av_frame_alloc();
    AVPacket* pkt=av_packet_alloc();
    frame->format=codec_ctx->pix_fmt;
    frame->width=codec_ctx->width;
    frame->height=codec_ctx->height;

    av_frame_get_buffer(frame,0);//分配frame的buff
    int frame_bytes=av_image_get_buffer_size(frame->format,frame->width,frame->height,1);
    uint8_t* yuv_buff=av_malloc(frame_bytes);
    memset(yuv_buff,0,frame_bytes);
    int pts=0;
    int ret=0;
    uint64_t begin=time(0);
    while(1)
    {
    
    
        int rsize=fread(yuv_buff,1,frame_bytes,yuv_file);
        ret = av_frame_make_writable(frame);
        if(ret != 0)
            printf("av_frame_make_writable failed, ret = %d\n", ret);

        int need_size=av_image_fill_arrays(frame->data,frame->linesize,yuv_buff,frame->format,frame->width,frame->height,1);
        if(rsize!=need_size)break;
        frame->pts=pts;
        pts+=1;

        encode(codec_ctx,frame,pkt,out_file);
    }
    encode(codec_ctx,NULL,pkt,out_file);
    printf("time:%lld",time(0)-begin);
    return 0;
}

3. Explicação dos pontos de conhecimento de codificação relevantes

1. Problemas de configuração de parâmetros:

Ao codificar vídeo, defina os parâmetros de contexto do codificador: taxa de código, largura, altura, formato, taxa de quadros, etc.
Configurações do quadro: largura, altura, formato.
Em seguida, calcule os dados de um quadro: largura * altura * o número de bytes ocupados pelo formato.
Geralmente use av_image_get_buffer_size para calcular

2. Sobre av_opt_set

av_opt_set é usado para definir parâmetros

  • preset
    O parâmetro preset é um parâmetro que pesa a velocidade de codificação e a taxa de compressão. Quanto mais lenta a velocidade de codificação, maior a taxa de compressão. Parâmetros:
    ultrarrápido
    super
    rápido
    muito rápido
    mais rápido
    rápido
    médio – predefinição padrão O padrão é médio
    lento
    mais lento
    muito lento
  • tune
    O parâmetro tune é utilizado para dar ênfase visual, ou seja, o que deve ser comprimido durante a compressão e o que deve ser retido...
    Parâmetros:
    filme: tipo de filme, use esta opção quando a qualidade do vídeo for
    animação muito restrita: desenho animado, vídeo compactado Use esta opção quando for uma animação.
    granulação: As partículas são muito pesadas. Esta opção é adequada para vídeos com muita granulação.
    imagem fixa: imagens estáticas. Esta opção é usada principalmente para vídeos com imagens mais estáticas.
    psnr: Melhorar psnr. A proporção psnr do vídeo codificado pela opção é maior
    ssim: melhorar ssim, o vídeo ssim codificado por esta opção é maior
    fastdecode: decodificação rápida, esta opção é benéfica para decodificação rápida
    latência zero: atraso zero, esta opção é usado principalmente para transmissão de vídeo ao vivo
  • perfil
  1. perfil de linha de base: qualidade básica de imagem. Suporta quadros I/P, suporta apenas Progressivo e CAVLC;
  2. perfil estendido: qualidade de imagem avançada. Suporta quadros I/P/B/SP/SI, suporta apenas Progressive e CAVLC;
  3. perfil principal: qualidade de imagem mainstream. Fornece quadros I/P/B, suporta Progressivo e Entrelaçado e também suporta CAVLC e CABAC;
  4. alto perfil: qualidade de imagem de alto nível. Com base no perfil principal, são adicionadas previsão interna 8x8, quantização personalizada, codificação de vídeo sem perdas e mais formatos YUV;

3. Sobre configurações de fluxo de código

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/m0_60565784/article/details/131614914
Recomendado
Clasificación