You need to enable JavaScript to run this app. 如何通过FFmpeg读取H264码流中未注册类型的SEI用户自定义数据
优惠活动
大模型
产品
解决方案
定价
更多

如何通过FFmpeg读取H264码流中未注册类型的SEI用户自定义数据

问题原因

  • 你当前直接访问AVCodecContext的priv_data获取H264Context属于调用FFmpeg内部私有结构,FFmpeg官方不开放这种使用方式,私有结构的内存布局、字段含义随时可能变动,4.4版本下这种方式本身就无法稳定拿到SEI数据。
  • 解码后的SEI数据会跟随AVFrame输出,正确做法是读取AVFrame的Side Data获取未注册SEI数据。

调整方案

第一步:解码器配置额外参数

打开解码器之前,给AVCodecContext设置参数,开启SEI数据导出能力:

// 开启将未注册用户SEI数据导出到side data的功能
av_opt_set(m_pVidDecodeCtx->priv_data, "export_side_data", "sei", 0);

第二步:从解码后的AVFrame中读取SEI

调用avcodec_receive_frame拿到有效AVFrame后,通过以下代码读取未注册SEI:

// 确认avcodec_receive_frame成功拿到frame后执行
AVFrameSideData *sei_side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_SEI_UNREGISTERED);
if (sei_side_data && sei_side_data->data && sei_side_data->size > 16) {
    // 未注册SEI前16字节是你写入的UUID,对应命令里的086f3693-b7b3-4f2c-9653-21492feee5b8
    const uint8_t *uuid = sei_side_data->data;
    // 16字节之后才是实际的用户数据内容
    const uint8_t *user_data = sei_side_data->data + 16;
    int user_data_len = sei_side_data->size - 16;
    // 注意用户数据不是默认以\0结尾,不要直接当字符串打印,按长度输出避免越界
    printf("SEI用户数据:%.*s\n", user_data_len, user_data);
}

补充说明

如果单帧存在多个未注册SEI,需要遍历所有AV_FRAME_DATA_SEI_UNREGISTERED类型的side data,匹配你自己的UUID之后再读取内容,避免拿到其他来源的SEI数据。不要直接访问H264Context这类内部私有结构体,所有公开功能FFmpeg都提供了对应的公开API,私有结构的使用不受版本兼容性保障。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 11:36:03