-
打开图片1,打开解码器
-
打开图片2,打开解码器
-
打开输出文件
-
分配音视频文件封装实例
avformat_alloc_output_context2(&out_fmt_ctx, nullptr, nullptr, dest_name);#include <libavformat/avformat.h> int avformat_alloc_output_context2(AVFormatContext **out_ctx, const AVOutputFormat *ofmt, const char *format_name, const char *filename); -
打开输出流
avio_open(&out_fmt_ctx->pb, dest_name, AVIO_FLAG_READ_WRITE);#include <libavformat/avformat.h> int avio_open(AVIOContext **s, const char *url, int flags); -
创建编码器
AVCodec *codec = avcodec_find_encoder(AV_CODEC_ID_H264);
AVCodecContext *encodec = avcodec_alloc_context3(codec); -
设置编码器参数(像素格式、视频宽高、帧率、时间基、关键帧间隔时间等)
encodec->pix_fmt = AV_PIX_FMT_YUV420P;
encodec->width = src_vStream->width();
encodec->height = src_vStream->height();
encodec->framerate = (AVRational{25,1});
encodec->time_base = (AVRational{1,25});
encodec->gop_size = 12;
encodec->max_b_frames = 0; // 0 表示不要B帧
if(out_fmt_ctx->oformat0>flag & AVFMT_GLOBALHEADER){
// 允许操作系统显示该视频的缩略图
encodec->flags = AV_CODEC_FLAG_GLOBAL_HEADER;
} -
打开编码器
-
创建新的数据流
avformat_new_stream(out_fmt_ctx, nullptr); -
把编码器参数实例复制给目标结构体
avcodec_parameters_from_context(dest_vStream->codecpar, encodec); -
设置视频流索引
dest_vStream->codecpar->codec_tag = 0; -
写文件头
avformat_write_header(out_fmt_ctx, nullptr); -
对视频帧重新编码写入文件(2遍)
-
写入文件尾
av_write_trailer(out_fmt_ctx);