H.264 h264:添加用户未注册的SEI消息

H.264 h264:添加用户未注册的SEI消息,h.264,video-encoding,H.264,Video Encoding,我试图用SEI用户数据消息编写一个NAL单元。我的代码如下所示: typedef struct { unsigned char type_code; unsigned char countryCode; unsigned char countryCodeExtension[2]; unsigned char user_identifier[4]; unsigned char payloadBytes[20]; unsigned char marke

我试图用SEI用户数据消息编写一个NAL单元。我的代码如下所示:

typedef struct {
    unsigned char type_code;
    unsigned char countryCode;
    unsigned char countryCodeExtension[2];
    unsigned char user_identifier[4];
    unsigned char payloadBytes[20];
    unsigned char marker_bits;
} userdata_reg_t35;

unsigned char begin[5] = {0x00, 0x00, 0x00, 0x01, 0x06};
unsigned char end[3] = {0x00, sizeof(userdata_reg_t35), 0x80};

userdata_reg_t35 m_userSEIData;
m_userSEIData.countryCode = 0xB5;
m_userSEIData.countryCodeExtension[0] = 0x31;
m_userSEIData.countryCodeExtension[1] = 0x00;
m_userSEIData.user_identifier[0] = 0x34;
m_userSEIData.user_identifier[1] = 0x39;
m_userSEIData.user_identifier[2] = 0x41;
m_userSEIData.user_identifier[3] = 0x47;
m_userSEIData.type_code = 0x03;
m_userSEIData.marker_bits = 0xFF;
sprintf((char*)m_userSEIData.payloadBytes, "%s", "My Payload");

memcpy(target, begin, 5);
memcpy(target + 5, &m_userSEIData, sizeof(userdata_reg_t35));
memcpy(target + 5 + sizeof(userdata_reg_t35), end, 3);
在mplayer或vlc中播放文件时,我收到错误:

[h264 @ 0x7f5860c20720] SEI type 3 truncated at 216
我做错了什么

**编辑**

我阅读后修改了代码


但我仍然得到libav错误:,第306行。我还做错了什么?

这看起来不太好,也不符合H.264附录D规范

您正在添加seinal类型,然后您需要添加payloadType、payloadSize值—您没有这些值。然后您声明您想要未注册的SEI消息(类型5),并且您的内容看起来更像负载类型4(显然您正在添加标题)。所以你需要把它包括进去,排除类型代码,这样看起来就差不多了

也就是说,您不需要的type_代码3代替了预期值5/4,因此没有长度。VLC恰好发现了这个

有关详细信息,请参阅H.264 D.1 SEI有效负载语法

更新。由于另一个原因,您更新的代码不正确。您正在使用开始代码执行附录B字节流,同时还包括20个零字节的有效负载,在正常情况下,应使用仿真预防字节进行更新


要将您得到的内容与x264生成的内容进行比较,只需使用二进制编辑器打开x264输出并检查序列,然后与您的进行比较。

谢谢。我已经更改了代码,但仍然收到一个错误。你知道怎么了吗?这是对齐问题吗?
static const uint8_t uuid[16] = {0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7,
    0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef};
unsigned char begin[7] = {0x00, 0x00, 0x00, 0x01, 0x06, 0x05, 16 + 20};
char szPayload[20];
memset(szPayload, 0, 20);
sprintf(szPayload, "%s", "My payload");
memcpy(target, begin, 7);
memcpy(target + 7, uuid, 16);
memcpy(target + 7 + 16, szPayload, 20);