常用的结构体
- AVCodec:编解码结构体
- AVCodecContext:编解码上下文
- AVFrame:解码后的帧
结构体的常用api
- av_frame_alloc():生成AVFrame结构体的
- av_frame_free():释放AVFrame结构体
- avcodec_alloc_context3():生成编解码器上下文
- avcodec_free_context:释放解码器上下文
解码的步骤
- 查找解码器:avcodec_find_decoder
- 打开解码器:avcodec_open2
- 解码:avcodec_decode_video2
H264的编码流程
- 查找解码器:avcodec_find_encoder_by_name
- 设置编码参数,并打开编码器:avcodec_open2
- 编码:avcodec_encode_video2
实战案例
#include <stdio.h>
#include <stdlib.h>
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
#include <libavuil/imgutil.h>
int main(int argc, char **argv)
{
const char * filename, *codec_name;
const AVCodec *codec;
AVCodecContext *c = NULL;
int i, ret, x, y, got_outget;
FILE *f;
AVFrame *frame;
AVPacket pkt;
uint8_t encode[] = {0, 0, 1, 0xb7};
avcodec_register_all();
// 拿到具体的编解码器
codec = avcodec_find_encoder_by_name(codec_name)
c = avcodec_all_codec_context3(codec);
c->bit_rate = 400000;
c->width = 352;
c->height = 288;
c->time_base = (AVRational){1, 25};
c->framerate = (AVRational){25, 1};
c->gop_size = 10; // 一组帧是多少,10帧生成一个关键帧
c->max_b_frames = 1;
c->pix_fmt = AV_PIX_FMT_YUV420P;
if (codec-> == AV_CODEC_ID_H264){
av_opt_set(c->priv_data, "preset", "slow", 0);
}
if (avcodec_open2(c, codec, NULL)<0){
fprintf(stderr, "Could not open codec\n");
exit(1);
}
f = fopen(filename, "wb");
if (!f){
fprintf(stderr, "Coudld not open %s\n", filename);
exit(1);
}
}
网友评论