2016-05-16 5 views
0

Я пытаюсь написать блок NAL с сообщением пользователя пользователя SEI. Мой код выглядит следующим образом:h264: Добавить незарегистрированное сообщение SEI

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 

Что я делаю неправильно?

** EDIT **

Я изменил код после прочтения http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c#l563

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); 

, но я все еще получаю ошибку libav: https://ffmpeg.org/doxygen/2.6/h264__sei_8c_source.html, строка # 306. Что я все еще делаю неправильно?

ответ

0

Это не выглядит хорошо, и оно плохо отображается на спецификации H.264 Annex D.

Вы добавляете тип SEI NAL, тогда вы должны добавить значения payloadType, payloadSize - их у вас их нет. Затем вы заявили, что хотите получить незарегистрированное сообщение SEI (тип 5), и ваш контент больше выглядит как полезный тип 4 (видимо, вы добавляете титры). Поэтому вам нужно включить это и исключить type_code, тогда он будет выглядеть примерно так.

То есть ваш ненужный type_code 3 идет вместо ожидаемого значения 5/4, а затем нет длины. VLC натыкается именно на это ...

Подробнее см. H.264 D.1 Синтаксис полезной нагрузки SEI.

ОБНОВЛЕНИЕ. Ваш обновленный код неверен [также] по другой причине. Вы выполняете поток байтов в приложении B с начальными кодами и в то же время включаете 20 нулевых байтов полезной нагрузки, которые при нормальных условиях должны быть обновлены с помощью байт предупреждения эмуляции.

Чтобы сравнить то, что вы получаете с тем, что производит x264, просто откройте выход x264 с помощью двоичного редактора и проверьте SEI NALs, а затем сравните с вашим.

+0

Спасибо. Я изменил код, но я все еще получаю сообщение об ошибке. Любая идея, что не так? Это проблема выравнивания? – gregoiregentil

 Смежные вопросы

  • Нет связанных вопросов^_^