FFmpeg新API中能否获取coded_width?(不使用废弃API)
新版FFmpeg获取coded_width/coded_height的正确方式
当然可以!在新版FFmpeg API中,完全不需要依赖已废弃的streams[videoStreamIndex]->codec来获取编码后的宽高(coded_width/coded_height),下面是标准且可靠的做法:
直接从AVCodecParameters获取
新版API里,每个AVStream结构体的codecpar字段就是专门用来存储流编码参数的AVCodecParameters,它的coded_width和coded_height与旧版废弃API中的对应参数完全一致,不存在所谓的“差异”。
示例代码:
// 假设你已经获取到了格式上下文format_ctx和视频流索引videoStreamIndex AVStream *video_stream = format_ctx->streams[videoStreamIndex]; int coded_width = video_stream->codecpar->coded_width; int coded_height = video_stream->codecpar->coded_height;
可能的误区:别混淆coded宽高和显示宽高
你提到担心AVCodecParameters的参数和coded_width有差异,大概率是混淆了两个概念:
coded_width/coded_height:编码帧的实际存储尺寸,可能包含为了编码对齐添加的黑边(比如H.264要求宽高是16的倍数)width/height:视频的显示尺寸,也就是实际内容的可视尺寸
旧版API中,这些参数也同时存在于streams[...]->codec里,新版只是把它们迁移到了codecpar中,定义完全没变。
解码器初始化后的参数同步
如果你后续需要打开解码器,解码器对应的AVCodecContext里也会同步这些参数——你可以通过avcodec_parameters_to_context把codecpar的参数复制到解码器上下文,此时解码器上下文的coded_width/coded_height和流层面的参数是完全一致的:
AVCodec *codec = avcodec_find_decoder(video_stream->codecpar->codec_id); AVCodecContext *decoder_ctx = avcodec_alloc_context3(codec); // 把流参数复制到解码器上下文 avcodec_parameters_to_context(decoder_ctx, video_stream->codecpar); avcodec_open2(decoder_ctx, codec, NULL); // 这里的coded_width和video_stream->codecpar->coded_width完全相同 int decoder_coded_w = decoder_ctx->coded_width;
总结一下:完全可以放心使用AVCodecParameters来获取coded_width和coded_height,这是FFmpeg官方推荐的新版做法,和旧版废弃API的结果完全一致,不存在参数差异的问题。
内容的提问来源于stack exchange,提问作者Vltber
相关产品推荐
相关产品推荐

