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用于编解码过程的控制。

相关推荐
听风吹等浪起7 小时前
002:多图合并导出PDF【网页版】
计算机视觉·pdf
Microvision维视智造12 小时前
火腿肠里有没有异物?穿刺针尖有没有毛刺?——视觉检测守护“舌尖上的安全“
人工智能·计算机视觉·视觉检测
我是小杰啊13 小时前
幻视是什么?一款用自然语言搜索图片与视频的 AI 视觉问答工具
人工智能·计算机视觉·多模态·ai应用·视频搜索
皓悦编程记13 小时前
【免费数据集009期】Urban Issues Dataset:10类城市公共场景异常目标检测数据集
人工智能·计算机视觉·目标跟踪
视***间17 小时前
专为具身智能而生,视程空间ARC系列载板,定义新一代机器人算力底座
网络·人工智能·深度学习·计算机视觉·机器人·ai算力
饼饼学习空间智能17 小时前
2026机器人如何持续学习?具身智能仿真、合成数据与Real2Sim2Real技术解析
人工智能·深度学习·计算机视觉
盼小辉丶17 小时前
OpenCV-Python实战——分析与加速OpenCV应用程序
python·神经网络·opencv·计算机视觉
动物园猫17 小时前
钢材表面缺陷目标检测数据集:6类别 | 目标检测
人工智能·目标检测·计算机视觉
学AI不秃头17 小时前
官方要 16GB,实测 4-bit 压到 2.9GB:把 LocateAnything-3B 搬上 8GB Jetson
python·深度学习·机器学习·计算机视觉·机器人
小北的AI科技分享2 天前
2026视觉检测设备厂家排名:四大主流品牌技术与产品深度测评
人工智能·计算机视觉·视觉检测