Proceso de codificación de video Los datos YUV se codifican en datos H264

1. Proceso de codificación de video

Insertar descripción de la imagen aquí

2. Demostración práctica

#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. Explicación de los puntos de conocimiento de codificación relevantes.

1. Problemas de configuración de parámetros:

Al codificar video, configure los parámetros de contexto del codificador: velocidad de código, ancho, alto, formato, velocidad de cuadros, etc.
Configuración del cuadro: ancho, alto, formato.
Luego calcule los datos de un cuadro: ancho * alto * el número de bytes ocupados por el formato
Generalmente use av_image_get_buffer_size para calcular

2. Acerca de av_opt_set

av_opt_set se utiliza para establecer parámetros

  • preset
    El parámetro preestablecido es un parámetro que pesa la velocidad de codificación y la tasa de compresión. Cuanto más lenta sea la velocidad de codificación, mayor será la tasa de compresión. Parámetros:
    ultrarrápido
    superrápido
    muy rápido
    más
    rápido
    rápido
    medio – predeterminado predeterminado El valor predeterminado es medio
    lento más
    lento
    muy lento
  • tune
    El parámetro tune se usa para énfasis visual, es decir, qué se debe comprimir durante la compresión y qué se debe retener...
    Parámetros:
    película: tipo de película, use esta opción cuando la calidad del video sea muy estricta
    animación: dibujos animados, video comprimido Utilice esta opción cuando sea una animación.
    grano: las partículas son muy pesadas. Esta opción es adecuada para videos con gran granulación.
    imagen fija: imágenes fijas. Esta opción se usa principalmente para videos con imágenes más estáticas.
    psnr: Mejorar psnr. La proporción de psnr del video codificado por la opción es mayor
    ssim: mejorar ssim, el video ssim codificado por esta opción es mayor
    fastdecode: decodificación rápida, esta opción es beneficiosa para la decodificación rápida
    latencia cero: retardo cero, esta opción es utilizado principalmente para transmisión de video en vivo
  • perfil
  1. perfil de referencia: calidad de imagen básica. Admite tramas I/P, solo admite Progresivo y CAVLC;
  2. perfil extendido: calidad de imagen avanzada. Admite tramas I/P/B/SP/SI, solo admite progresiva y CAVLC;
  3. perfil principal: calidad de imagen convencional. Proporciona marcos I/P/B, admite progresivo y entrelazado, y también admite CAVLC y CABAC;
  4. perfil alto: calidad de imagen de alto nivel. Basado en el perfil principal, se agregan predicción interna 8x8, cuantificación personalizada, codificación de video sin pérdidas y más formatos YUV;

3. Acerca de la configuración del flujo de código

Insertar descripción de la imagen aquí

Supongo que te gusta

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