2017-08-11 7 views
0

nvidiaグリッドベースのハードウェアエンコーダを使用するようにh264_encoder_implを変更しました。これは、OpenH264固有の呼び出しをNvidia API呼び出しに置き換えることによって行われます。エンコードされたストリームはファイルに正常に書き込むことができますが、_buffer_sizeの文字はencoded_image_で十分ではなく、RTPFragmentationHeaderも入力する必要があります。WebRTC:エンコーダ実装でRTPFragmentationHeaderとは何ですか?

// RtpFragmentize(EncodedImage* encoded_image, 
//      std::unique_ptr<uint8_t[]>* encoded_image_buffer, 
//      const VideoFrameBuffer& frame_buffer, 
//      SFrameBSInfo* info, 
//      RTPFragmentationHeader* frag_header) 

// encode 
openh264_->Encode(input, &info /*out*/); 

// fragmentize ? 
RtpFragmentize(&encoded_image_ /*out*/, &encoded_image_buffer_, *frame_buffer, 
       &info, &frag_header /*out*/); 

// ... 

// send 
encoded_image_callback_->OnEncodedImage(encoded_image_, &codec_specific, &frag_header); 

現在Openh264ベースの実装はRTPFragmentize()frag_headerを満たし、VP8は異なり、それを埋めます。私はNALと何かを見ることができます。encoded_image->_lengthも計算されていますが、どのようにすればいいのか分かりません。

どこにもドキュメントがありません。 VP8とOpenH264の実装はすべて私が持っています。

だからRTPFragmentationHeaderとは何ですか?それは何をするためのものか? encoded_image->_lengthとは何ですか?カスタムH264エンコーダを使用して正しく記入する方法は?私はスタートコードを見つけることができますが、次に何ですか?すべてのメンバーをどのように満たすのですか?

答えて

1

RTPFragmentize()を経由してh264_encoder_implに行った後、私はそれを理解しました。

エンコードされたフレームには、複数のNALUがあります。 AUD、SPS(67)、PPS(68)、IDRなどの異なるNALUがあります。各NALUは、00 00 00 01の4バイトのスタートコードで区切られています。 OpenH264のために

、ヘッダは、あなたが太字でコードを始める見ることができる最初のフレーム

 
[00 00 00 01 67 42 c0 20 8c 8d 40 20 03 09 00 f0 
88 46 a0 00 00 00 01 68 ce 3c 80]00 00 00 01 .. 

のために、このように見えました。大括弧で囲まれたバイトのみがヘッダーに属し、最後の開始コードはフレームデータ用です。上記ため

RTPFragmentationHeader

frag_header->fragmentationVectorSize = 3  // 2 fragments for header 
              // 3rd fragment for frame buffer 

frag_header->fragmentationOffset[0] = 4  
frag_header->fragmentationLength[0] = 15 

frag_header->fragmentationOffset[1] = 23 // 4 + 15 + sizeof(startcode) 
frag_header->fragmentationLength[1] = 4  

frag_header->fragmentationOffset[2] = 31 
frag_header->fragmentationLength[2] = 43218 // last fragment is frame buffer 

次にフレームは常に

00 00 00 01 67 b8 .. .. .. 

encoded_image->_lengthを次のように見えただけ一つの断片は、実際の符号化されたフレームバッファと
encoded_image->_sizeのサイズが最大サイズである持っていました符号化されたフレームバッファ。

OpenH264 APIは、ヘッダーが実際にフレームで追加されているかどうかにかかわらず、APIが提供されたヘッダーとそのサイズのみを使用している間にフラグメントを計算するために使用される、ヘッダーのサイズだけのフレームバイトの検索は、断片化の正しい計算を可能にしました。

これで、最終的にエンコードされたデータが送信され、クライアントブラウザで正しくデコードされました。

関連する問題