FFmpeg解码流程核心要点
目录
一、4 个核心结构体(谁是干啥的)
二、解码初始化固定顺序(模板)
三、解码循环固定写法(必须会抄)
四、裸流专用(非 mp4 才需要)
一、4 个核心结构体(谁是干啥的)
-
AVCodec
解码器“类型说明书”,描述支持什么格式、名字等。 -
AVCodecContext
解码器“这一次工作的大脑和状态”,本次解码的所有参数/缓冲都挂在这里。 -
AVPacket
一包压缩数据(送进解码器的东西)。 -
AVFrame
一帧解码后的原始数据(从解码器拿出来的东西)。
二、解码初始化固定顺序(模板)
-
avcodec_find_decoder()
找到对应格式的解码器(得到AVCodec)。 -
avcodec_alloc_context3()
创建解码上下文(AVCodecContext)。 -
avcodec_open2()
打开解码器,完成初始化。 -
av_frame_alloc()
分配一个AVFrame,用于接收解码输出。 -
av_packet_alloc()
分配一个AVPacket,用于装每次要送进去的压缩数据包。
三、解码循环固定写法(必须会抄)
-
正常解码每个包:
avcodec_send_packet(ctx, pkt); while (avcodec_receive_frame(ctx, frame) >= 0) {// 使用这一帧 frame } -
结尾 flush:
avcodec_send_packet(ctx, NULL); // 送 NULL 包 while (avcodec_receive_frame(ctx, frame) >= 0) {// 处理最后冲出来的帧 }
四、裸流专用(非 mp4 才需要)
-
结构体:
AVCodecParserContext
作用:从连续字节流中 按帧切出AVPacket。 -
函数:
av_parser_parse2()
作用:-
输入:一段字节数据
-
输出:可能产生一个完整的
pkt->data+pkt->size -
没有完整包就继续喂,下次接着解析。
-
容器格式(mp4/mkv)一般用
av_read_frame,不需要 parser;
裸流(ES)才需要AVCodecParserContext + av_parser_parse2。
