当前位置: 首页 > news >正文

FFmpeg 基本API avcodec_receive_frame函数内部调用流程分析

1、avcodec_receive_frame 函数定义

avcodec_receive_frame 是 FFmpeg 多媒体处理框架中的核心函数,属于其现代解码 API 的关键组成部分。它与 avcodec_send_packet 配对使用,实现解码。基本流程如下:

  • 发送数据包:调用 avcodec_send_packet 将压缩数据包送入解码器。
  • 循环接收帧:在 while 循环中反复调用 avcodec_receive_frame,直到其返回 AVERROR(EAGAIN)(表示需要新输入)或 AVERROR_EOF(表示数据已取完)。因为一个数据包可能解码出多个帧,或者解码器内部有缓存,所以需要循环读取。
int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{// 1. 清空输出帧av_frame_unref(frame);// 2. 判断编解码器类型并分派if (av_codec_is_decoder(avctx->codec))return ff_decode_receive_frame(avctx, frame);  // 解码路径return ff_encode_receive_frame(avctx, frame);      // 编码路径
}
/*
实现异步解码模型的结果获取端
支持复杂帧关系处理(B帧、分片帧等)
提供硬件加速的统一接口
已成为 FFmpeg 解码操作的标准实践
*/
  • 参数:
    • avctx: 编解码器上下文
    • frame: 输出帧容器(用户分配内存)
  • 返回值:
    • 0: 成功获取一帧
    • AVERROR(EAGAIN): 需要更多输入数据
    • AVERROR_EOF: 解码器已刷新完毕
    • <0: 其他错误

2、avcodec_receive_frame 内部调用逻辑

avcodec_receive_frame其内部源码调用分析:

int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
{// 1. 清空输出帧av_frame_unref(frame);// 2. 判断编解码器类型并分派if (av_codec_is_decoder(avctx->codec))return ff_decode_receive_frame(avctx, frame);  // 解码路径return ff_encode_receive_frame(avctx, frame);      // 编码路径
}
/*
实现异步解码模型的结果获取端
支持复杂帧关系处理(B帧、分片帧等)
提供硬件加速的统一接口
已成为 FFmpeg 解码操作的标准实践
*/

2.1 基础参数校验

if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))return AVERROR(EINVAL);
  • 检查编解码器是否打开且是解码器
  • 防止错误调用(如编码器调用此函数)

2.2 帧获取逻辑

[图片]

  • 缓冲区优先:避免重复解码
  • 引用移动:av_frame_move_ref()高效转移数据所有权

2.3 帧验证

ret = frame_validate(avctx, frame);

验证帧的完整性:

  • 视频:检查宽/高/格式是否有效
  • 音频:检查采样率/声道布局
  • 防止无效帧进入后续流程

2.4 视频帧裁剪处理

if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {ret = apply_cropping(avctx, frame);}

根据解码器上下文中的裁剪参数:

avctx->crop_top, avctx->crop_bottom, 
avctx->crop_left, avctx->crop_right

调整视频帧的可见区域。

2.5 帧计数更新

avctx->frame_num++;  // 全局帧计数器

3、avcodec_receive_frame 调用流程图

在这里插入图片描述

http://www.dtcms.com/a/502917.html

相关文章:

  • FFmpeg 基本API av_read_frame函数内部调用流程分析
  • 广东网站建设包括什么口碑好网站建设是哪家
  • 和田地区建设局网站电子商务网络营销是干嘛的
  • SAP B1实施专家指南:如何优化成本与缩短项目周期?
  • [吾爱大神原创工具] Python多功能自动化点击录入工具V1.0
  • 不备案怎么做淘宝客网站wordpress 字体调整
  • 栈及相关算法问题
  • Docker镜像分层与写时复制原理详解
  • 药物靶点研究3天入门|Day1:从疾病差异里挖“潜力靶点”,两步锁定真目标
  • WebForms ArrayList详解
  • 达梦数据库性能调优总结
  • [JavaEE初阶]HTTPS-SSL传输过程中的加密
  • 单片机开发中裸机系统有哪些(轮询、时间片、前后台.....)
  • 一次线上MySQL分页事故,搞了半夜...
  • 医院网站建设思路深圳展览设计公司
  • C#WPF关键类
  • 从文件加密到数据料理台:两款主流加密工具(EncFSMP/CyberChef)技术特性解析与开发实战选型
  • 什么是uv和传统的区别
  • FastAPI之 处理HTTP请求
  • 【2025-系统规划与管理师】第十章:云原生系统规划
  • 求一个矩阵中的鞍点
  • 《计算机视觉度量:从特征描述到深度学习》-- 大模型应用开发基础RAG方案介绍
  • 【C++】list的使用及底层逻辑实现
  • 网站开发的整体职业规划购物网站多少钱
  • 【JVM】线上JVM堆内存报警,占用超90%
  • 【JVM系列】-第1章-JVM与Java体系结构
  • 鸿蒙NEXT Wear Engine穿戴侧应用开发完全指南
  • OpenHarmony 与 HarmonyOS 的 NAPI 开发实战对比:自上而下与自下而上的差异解析
  • openHarmony之DSoftBus分布式软总线智能链路切换算法
  • TensorFlow2 Python深度学习 - 循环神经网络(GRU)示例