Directorio de artículos
1. Proceso de codificación de video
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
- perfil de referencia: calidad de imagen básica. Admite tramas I/P, solo admite Progresivo y CAVLC;
- perfil extendido: calidad de imagen avanzada. Admite tramas I/P/B/SP/SI, solo admite progresiva y CAVLC;
- perfil principal: calidad de imagen convencional. Proporciona marcos I/P/B, admite progresivo y entrelazado, y también admite CAVLC y CABAC;
- 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;