1

IP カメラからの H.264 RTP ストリームを処理します。私が使用しているカメラは、各 I フレームを複数の NAL ユニットに分割し、それぞれが RTP パケットに分割されます (開始フラグと終了フラグは、フレームではなく、各ユニットのサイズを決定します)。

フレーム送信が終了し、それを解凍するのに十分なデータがあることをどのように知ることができますか? フレームは複数のユニットで構成されているため、フラグを使用してその終了を判断することはできません。

私が扱ったほとんどのカメラは、フラグがフレームの開始と終了を決定する RTP パケットに各フレームを分割しました。したがって、終了フラグを待っているこのパケットからデータをアンパックします。これが完全なフレームです。

このカメラから取得した NAL ユニットのシーケンスは次のとおりです。

[NAL_UT_SPS] シーケンス パラメータ セット +

[NAL_UT_PPS] 画像パラメータセット

[NAL_UT_SEI] 補足強化情報

[NAL_UT_IDR_SLICE] I フレーム画像データのパート #1

[NAL_UT_IDR_SLICE] I フレーム画像データのパート 2

[NAL_UT_IDR_SLICE] I フレーム画像データのパート #3

[NAL_UT_SLICE] 1 番目の P フレーム

[NAL_UT_SLICE] 2 番目の P フレーム

[NAL_UT_SLICE] 3 番目の P フレーム

...

このシーケンスから、[NAL_UT_SPS] + [NAL_UT_PPS] + [NAL_UT_SEI] + 3*[NAL_UT_IDR_SLICE] を 1 つの I フレームに結合して、後でデコーダにフィードできることが明らかです。しかし、画像データのパーツ数はどのように判断すればよいのでしょうか? パーツ #X を受け取ったときに、それがシーケンスの最後ではないことをどのように確認できますか?

何か案は?

4

3 に答える 3

4

問題を解決しました。

解決策は次のとおりです。すべての非画像ユニット (上記の例では NAL_UT_SPS、NAL_UT_PPS、NAL_UT_SEI) をフレームの先頭にアタッチし、画像を含むパケット (NAL_UT_IDR_SLICE、NAL_UT_SLICE)についてはfirst_mb_in_slice フィールド(これは、画像データの最初のスライスであり、2 番目、3 番目とは等しくありません..)。

したがって、first_mb_in_slice==0 でバッファに画像データが含まれている場合は、それを返し、新しいフレーム データをバッファに書き込みます。それ以外の場合は、フレームを返さずにデータを追加するだけです。このようにして、フレーム #2 の受信を開始したときにフレーム #1 を返し、これが前のフレームの一部ではなく、新しいフレームであると判断できます。

[NAL_UT_SPS] フレーム #1 (I) 開始

[NAL_UT_PPS] フレーム #1 が続く

[NAL_UT_SEI] フレーム #1 が続く

[NAL_UT_IDR_SLICE] フレーム #1 画像データ、パート #1: first_mb_in_slice == 0

[NAL_UT_IDR_SLICE] フレーム #1 画像データ、パート #2: first_mb_in_slice > 0

[NAL_UT_IDR_SLICE] フレーム #1 画像データ、パート #3: first_mb_in_slice > 0

[NAL_UT_SLICE] フレーム #2 (P) 開始: first_mb_in_slice == 0 <- この時点で、最初のフレームを返します

[NAL_UT_SLICE] フレーム #3 (P) 開始: first_mb_in_slice == 0 <- 2 番目のフレームを返す

[NAL_UT_SLICE] フレーム #4 (P) 開始: first_mb_in_slice == 0 <- 3 番目のフレームを返す

[NAL_UT_SPS] フレーム #5 (I) 開始 <- 4 番目のフレームを返す

...

于 2013-02-25T16:18:22.940 に答える
0

ほとんどの H.264 デコーダーは、入力ストリームを NAL として受け入れます。あなたがうるさいデコーダーを持っていない限り、私はNALをデコーダーにフィードするだけです。一般に、NAL:frame またはスライス間の 1:1 の関係は保証されません。

于 2013-02-22T23:09:22.917 に答える