AVCodecParameters详解

概述

AVCodecParameters是 FFmpeg 库中用于描述编解码器参数的结构体,在 FFmpeg 3.0+ 版本中引入,用于替代部分 AVCodecContext 的功能,使得参数传递更加清晰和模块化。

主要用途

  • 描述音视频流的编解码属性

  • 在解复用(demuxing)和复用(muxing)过程中传递编解码信息

  • 独立于编解码器上下文(AVCodecContext)存储参数

核心成员详解

基本参数

复制代码
enum AVMediaType codec_type;     // 媒体类型
enum AVCodecID codec_id;         // 编解码器ID
uint32_t codec_tag;              // 编解码器标签(四字符码)

格式参数

复制代码
int format;                      // 格式(像素格式/采样格式)
int64_t bit_rate;                // 比特率(bits/s)

视频相关参数

复制代码
int width;                       // 图像宽度
int height;                      // 图像高度
AVRational sample_aspect_ratio;  // 像素宽高比
int field_order;                 // 场序
int color_range;                 // 色彩范围
int color_primaries;             // 颜色原色
int color_trc;                   // 传输特性
int color_space;                 // 色彩空间
int chroma_location;             // 色度位置

音频相关参数

复制代码
int sample_rate;                 // 采样率(Hz)
int channels;                    // 声道数
uint64_t channel_layout;         // 声道布局
int frame_size;                  // 每帧采样数

额外数据

复制代码
uint8_t *extradata;             // 编解码器私有数据
int extradata_size;             // 私有数据大小

其他参数

复制代码
int level;                      // 编解码器级别
int profile;                    // 编解码器档次
int video_delay;                // 视频延迟

使用示例

获取流参数

复制代码
AVFormatContext *fmt_ctx = NULL;
avformat_open_input(&fmt_ctx, filename, NULL, NULL);

// 从AVStream中获取编解码参数
AVCodecParameters *codecpar = fmt_ctx->streams[stream_index]->codecpar;

// 读取具体参数
printf("Codec ID: %d\n", codecpar->codec_id);
printf("Video size: %dx%d\n", codecpar->width, codecpar->height);
printf("Bitrate: %lld\n", codecpar->bit_rate);

创建解码器上下文

复制代码
// 查找解码器
const AVCodec *codec = avcodec_find_decoder(codecpar->codec_id);

// 创建解码器上下文
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);

// 将参数复制到解码器上下文
avcodec_parameters_to_context(codec_ctx, codecpar);

// 打开解码器
avcodec_open2(codec_ctx, codec, NULL);

复制参数

复制代码
AVCodecParameters *dst_params = avcodec_parameters_alloc();
avcodec_parameters_copy(dst_params, src_params);

与 AVCodecContext 的关系

特性 AVCodecParameters AVCodecContext
用途​ 存储编解码器静态参数 编解码器运行时上下文
内存管理​ 通常由AVStream管理 需要手动分配/释放
线程安全​ 只读,线程安全 非线程安全
包含内容​ 编解码器描述信息 编解码器状态和控制信息
版本​ FFmpeg 3.0+ 所有版本

重要函数

参数管理

复制代码
// 分配参数结构体
AVCodecParameters *avcodec_parameters_alloc(void);

// 释放参数结构体
void avcodec_parameters_free(AVCodecParameters **ppar);

// 复制参数
int avcodec_parameters_copy(AVCodecParameters *dst, 
                           const AVCodecParameters *src);

// 从上下文获取参数
int avcodec_parameters_from_context(AVCodecParameters *par,
                                    const AVCodecContext *codec);

// 将参数应用到上下文
int avcodec_parameters_to_context(AVCodecContext *codec,
                                  const AVCodecParameters *par);

实际应用场景

1. 流信息分析

复制代码
void print_stream_info(AVFormatContext *fmt_ctx) {
    for (int i = 0; i < fmt_ctx->nb_streams; i++) {
        AVCodecParameters *par = fmt_ctx->streams[i]->codecpar;
        
        printf("Stream #%d:\n", i);
        printf("  Type: %s\n", av_get_media_type_string(par->codec_type));
        printf("  Codec: %s\n", avcodec_get_name(par->codec_id));
        
        if (par->codec_type == AVMEDIA_TYPE_VIDEO) {
            printf("  Resolution: %dx%d\n", par->width, par->height);
        } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) {
            printf("  Sample Rate: %d Hz\n", par->sample_rate);
            printf("  Channels: %d\n", par->channels);
        }
    }
}

2. 转码参数设置

复制代码
// 设置输出流参数
AVCodecParameters *out_par = out_stream->codecpar;
avcodec_parameters_copy(out_par, in_stream->codecpar);

// 修改特定参数
out_par->bit_rate = 2000000;  // 设置目标码率

注意事项

  1. 内存管理 :AVCodecParameters通常由 AVStream管理,不需要手动分配/释放

  2. 线程安全 :AVCodecParameters是只读结构,可以在多线程环境中安全访问

  3. 生命周期:参数在流生命周期内保持不变

  4. 与AVCodecContext配合 :在编解码过程中,需要将参数复制到 AVCodecContext中使用

常见问题

1. 参数复制失败

复制代码
// 确保目标参数已分配
if (!dst_par) {
    dst_par = avcodec_parameters_alloc();
}
int ret = avcodec_parameters_copy(dst_par, src_par);
if (ret < 0) {
    // 错误处理
}

2. 新旧API兼容

复制代码
// FFmpeg 2.x
AVCodecContext *codec_ctx = stream->codec;

// FFmpeg 3.x+
AVCodecParameters *par = stream->codecpar;

总结

AVCodecParameters是 FFmpeg 中重要的编解码器参数描述结构体,它分离了编解码器的静态参数 和运行时状态 ,使得代码更加清晰和模块化。在现代 FFmpeg 编程中,应优先使用 AVCodecParameters来处理编解码器描述信息,而将 AVCodecContext用于编解码过程的控制。

相关推荐
陈嘿萌8 分钟前
ACM MM 2026|告别密集交互!ProtoHGF-Net:基于原型超图的RGBT目标检测新范式
图像处理·人工智能·深度学习·目标检测·计算机视觉·学术研究与理论基础
指针向南2 小时前
PDF 转 HTML 免费5种方法,体积0.5%到368%
图像处理·人工智能·计算机视觉·pdf
陕西亿鑫鸿物联技术有限公司3 小时前
传统安防利旧升级实战:如何基于边缘计算接入海康大华IPC构建AI分析系统?
深度学习·计算机视觉·边缘计算·物联网架构·流媒体技术
拜小白4 小时前
【论文解读】Ray-casting MLC:用几何感知光线投射做自训练房间布局估计
深度学习·计算机视觉·全景图
MarkHD21 小时前
超分辨率与图像放大:从ESRGAN的纹理重建到UltimateSDUpscale的4K分块实战
人工智能·深度学习·计算机视觉
硅谷秋水1 天前
Agentic World Action Models(AW-0)贡献与不足分析
人工智能·机器学习·计算机视觉·语言模型·机器人
拜小白1 天前
【论文解读】OmniSRNet:畸变感知学习——从单张全向图像恢复房间结构
深度学习·计算机视觉·全景图
何以解忧唯有撸码2 天前
c# + YOLODotNet+OpenCVSharp 实现物品轨迹追踪
计算机视觉·c#·winform·yolov8·opencvsharp
Carl_奕然2 天前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
代码山河2 天前
OpenCV进阶:鼠标事件的回调函数使用方法
目标检测·计算机视觉