2016-05-16 15 views
0

SEIユーザーデータメッセージを使用してNALユニットを作成しようとしています。私のコードは次のようになります。私はMPlayerやVLCでファイルを再生するとき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); 

、私はエラーを受け取ります

[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ペイロードの構文を参照してください。

更新。あなたの更新されたコードは別の理由で間違っています。あなたは、開始コードでAnnex Bのバイトストリームをやっていると同時に、通常の条件の下でエミュレーション防止バイトで更新されるペイロードの20バイトを含んでいます。

x264の製品と比較するには、バイナリエディタを使用してx264出力を開き、SEI NALを確認してから比較してください。

+0

ありがとうございました。コードを変更しましたが、まだエラーが発生しています。何が間違っているの?これは整列の問題ですか? – gregoiregentil

関連する問題