12

私はFFMPEGストリーミングベースラインh264ビデオを持っています。これをRTPにカプセル化し、デコードのためにSIP電話に送信する必要があります。デコードの進行には、Windows用のh264プラグインとMirialでLinphoneを使用しています。ただし、FFMPEGから巨大なフレームサイズ(3Kb〜9Kb)を取得することがありますが、これは明らかにMTUに適合しません。

これらのフレームを「現状のまま」送信し​​、IPフラグメンテーション機能を信頼すると、一部の電話はそれを十分に再生できますが、他の電話はチョークしてストリームをデコードできません。これは、ストリームがRFC 3984に準拠していないためだと思います。これは、MTUに収まらないパケットを異なるNALUに分離し、RTPのマーク機能でフレームの終わりをマークする必要があることを指定しています。

IまたはPフレームをどこで「カット」できるかをどのように知ることができますか?断片化されたh264パケット(マークラベルのないもの)が0xF8で終了することがありますが、パターンを完全に取得できず、RTPを介してこれらのパケットを送信する方法を説明するRFC 3984で、その方法が指定されていないことに気付きました。

更新:最大サイズのNALUを生成する方法をX264ライブラリに指示する方法を知っている人はいますか?そうすれば、この問題を回避できるはずです。みんな、ありがとう

4

2 に答える 2

15

RFC 3984bis (RFC 6184 になる予定) の作成者として、H.264 NAL を RFC 3984 パケットに変換する方法を正確に詳しく説明しています。3 つのモードがあります: 0 (シングル NAL)、1 (NAL のフラグメント化と結合が可能)、および 2 (送信順序をフラグメント化、結合、およびインターリーブして、バースト損失がストリームに与える影響などを変更できます)。 )。SDP パケット化モードを参照してください。モード 0 のみが必要です。

モード 0 (Single-NAL) では、UDP フラグメンテーションを使用する (非推奨) か、エンコーダーに MTU-X より大きい NAL を生成しないように指示する必要があります。これをエンコーダーに伝えることができるはずです。

モード 1 ではフラグメント化できます。FU-A パケットの設定方法については、RFC を参照してください。断片化情報は前面にあります。また、STAP を使用して、IDR の前に (通常は) 送信される SPS や PPS パケットなどの小さな NAL を集約することもできます。各パケットには、増分されたシーケンス番号を持つ通常の RTP ヘッダーが必要です (ただし、タイムスタンプは同じです)。

フレーム (フラグメントまたは NAL ではない) の最後の RTP パケットのマークが期待されますが、それを当てにするべきではありません。

于 2011-04-07T20:27:06.663 に答える
6

x264 では、x264_param_t の int i_slice_max_size を使用してサイズを制御できると思います。x264.h を見てください。これをどこで読んだか思い出せませんが、投稿には、この構造体メンバーを使用して NAL サイズを制御できると書かれていましたが、自分で試したことはありません。

int i_slice_max_size; /* スライスあたりの最大サイズ (バイト単位)。推定 NAL オーバーヘッドが含まれます。*/

編集:ソースを見つけました

http://mailman.videolan.org/pipermail/x264-devel/2011-February/008263.html

于 2011-04-25T16:01:57.530 に答える