使用FFmpeg写入VP8编码RTP包至WebM时av_write_header失败排查
解决avformat_write_header写入WebM/MKV失败的问题
我看了你的代码和报错日志,导致avformat_write_header失败的原因很明确,结合日志里的两条关键提示就能定位:
Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
dimensions not set
核心问题
FFmpeg的新版本已经不再推荐使用AVStream.codec向复用器(muxer)传递编码参数,而是改用AVStream.codecpar。你的代码创建了编码上下文context并设置了宽高、像素格式等参数,但没有把这些参数同步到输出流的codecpar中,导致WebM复用器无法获取视频的尺寸信息,最终写入头部时失败。
修复步骤
在创建输出流stream之后,添加一行代码把编码上下文的参数复制到流的codecpar中,并且确保参数传递完成后再进行后续的IO操作:
stream = avformat_new_stream(format, codec); if (!stream) { printf("Cannot create a new stream\n"); goto last; } // 新增:将编码上下文的参数复制到流的codecpar中 err = avcodec_parameters_from_context(stream->codecpar, context); if (err < 0) { printf("Failed to copy codec parameters: %s\n", av_make_error_string(errorLog, 128, err)); goto last; } // 同步流的时间基与编码上下文一致 stream->time_base = context->time_base; // 后续的avio_open和avformat_write_header操作保持不变
额外说明
- 你之前的代码里
avformat_new_stream的第二个参数codec在新版本中可以传NULL,不过传现有codec也不影响修复效果。 - 修复后,复用器就能正确获取视频的宽高、像素格式等必要参数,
avformat_write_header就能正常执行了。 - 后续处理VP8 RTP数据包时,记得把RTP payload解析成正确的VP8帧,封装成
AVPacket后调用av_interleaved_write_frame写入输出流,还要注意设置正确的pts和dts值,保证视频时序正常。
内容的提问来源于stack exchange,提问作者Kamal Palei
相关产品推荐
相关产品推荐

