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
相关产品推荐
相关产品推荐

