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

使用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操作保持不变

额外说明

  1. 你之前的代码里avformat_new_stream的第二个参数codec在新版本中可以传NULL,不过传现有codec也不影响修复效果。
  2. 修复后,复用器就能正确获取视频的宽高、像素格式等必要参数,avformat_write_header就能正常执行了。
  3. 后续处理VP8 RTP数据包时,记得把RTP payload解析成正确的VP8帧,封装成AVPacket后调用av_interleaved_write_frame写入输出流,还要注意设置正确的pts和dts值,保证视频时序正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:50:55