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

FFmpeg音频流处理:如何通过API获取其fourcc编码类型?

FFmpeg MPEG音频流类型与比特率获取解决方案

问题根源

  • AVStream.id是容器层级的流标识字段,作用是区分同一容器内的多个不同流(如视频、音频、字幕流),和编码子类型无任何关联,大部分解复用器未对该字段赋值时默认返回0,读取该字段无法获取流类型信息。
  • AVCodecContext.codec_id仅标识编码标准的大分类,不会细化标注同标准下的子类型/层级,因此AV_CODEC_ID_MP3会匹配所有MPEG Audio Layer 1/2/3的流,无法直接区分三类流。

解决方法

区分MP1/MP2/MP3流类型

FFmpeg将同编码标准下的子类型信息存储在AVCodecContext.profile字段中,针对MPEG音频,该字段的取值直接对应音频层级:

  • FF_PROFILE_MPEG_AUDIO_L1:MPEG Audio Layer 1(MP1)
  • FF_PROFILE_MPEG_AUDIO_L2:MPEG Audio Layer 2(MP2)
  • FF_PROFILE_MPEG_AUDIO_L3:MPEG Audio Layer 3(MP3)

如果已经解码得到AVFrame结构,也可以直接读取AVFrame.profile字段获取相同的层级信息。

比特率获取补充说明

通过AVCodecContext.bit_rate读取的是封装头部标注的平均比特率,若处理的是VBR(动态比特率)流,该字段可能返回0或近似参考值。如果需要获取精准的瞬时比特率,可通过单帧数据自行计算:
单帧比特率(bps) = 单帧数据长度(字节) * 8 / 单帧时长(秒)

代码示例

// 前置条件:已完成解复用、匹配到音频流、已打开对应编解码器上下文
AVCodecContext *audio_codec_ctx = ...;

if (audio_codec_ctx->codec_id == AV_CODEC_ID_MP3) {
    switch (audio_codec_ctx->profile) {
        case FF_PROFILE_MPEG_AUDIO_L1:
            printf("流类型:MP1\n");
            break;
        case FF_PROFILE_MPEG_AUDIO_L2:
            printf("流类型:MP2\n");
            break;
        case FF_PROFILE_MPEG_AUDIO_L3:
            printf("流类型:MP3\n");
            break;
        default:
            printf("未知MPEG音频类型\n");
    }
    printf("封装标注比特率:%d bps\n", audio_codec_ctx->bit_rate);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:18:01