You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何libavutil中的get_frame_defaults是内部函数?

FFmpeg AVFrame 初始化的限制

先看FFmpeg内部用于初始化AVFrame的函数实现:

static void get_frame_defaults(AVFrame *frame)
{
    memset(frame, 0, sizeof(*frame));

    frame->pts                   =
    frame->pkt_dts               = AV_NOPTS_VALUE;
    frame->best_effort_timestamp = AV_NOPTS_VALUE;
    frame->duration            = 0;
#if FF_API_PKT_DURATION
FF_DISABLE_DEPRECATION_WARNINGS
    frame->pkt_duration        = 0;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
#if FF_API_FRAME_PKT
FF_DISABLE_DEPRECATION_WARNINGS
    frame->pkt_pos             = -1;
    frame->pkt_size            = -1;
FF_ENABLE_DEPRECATION_WARNINGS
#endif
    frame->time_base           = (AVRational){ 0, 1 };
    frame->sample_aspect_ratio = (AVRational){ 0, 1 };
    frame->format              = -1; /* unknown */
    frame->extended_data       = frame->data;
    frame->color_primaries     = AVCOL_PRI_UNSPECIFIED;
    frame->color_trc           = AVCOL_TRC_UNSPECIFIED;
    frame->colorspace          = AVCOL_SPC_UNSPECIFIED;
    frame->color_range         = AVCOL_RANGE_UNSPECIFIED;
    frame->chroma_location     = AVCHROMA_LOC_UNSPECIFIED;
    frame->flags               = 0;
}

这个函数被标记为static,仅能在定义它的源文件内部调用,外部代码无法直接访问。

初始化AVFrame的官方唯一途径是使用av_frame_alloc(以及用于操作已初始化AVFrame的av_frame_unref、av_frame_move_ref),这些函数均会在堆上动态分配AVFrame对象。

因此,FFmpeg没有原生方法支持初始化非动态分配的AVFrame对象(比如在栈上创建的AVFrame)。

对比之下,libavcodec提供了公开的av_init_packet函数,可用于初始化在栈等非堆位置创建的AVPacket对象。

内容的提问来源于stack exchange,提问作者zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:30:11