3

軸カメラからの rtp ストリームからさまざまな mpeg4 フレームを解析し、avcodec_decode_video 関数を使用してパケットを ffmpeg ライブラリにフィードしようとしています。ここに私がやっているステップがあります 1. rtspストリームが初期化されます 2. rtpストリームが流れ始めます 3. 最初のパケットは000001b0で始まります...そして構成データが続き、そのフレームの後に000001b6で始まります.. 2番目のrtpペイロードマーカービットが設定されているrtpパケットを取得するまでは異なります。その後、000001b6 で始まるパケットを取得し、約 5 ~ 10 個の rtp パケットが続きます。このパターンが繰り返されます。

私がしているのは、000001b0/b6 を検出した場合です。デコーダ コンテキストを適切に初期化した後、その後に来るすべてのパケットを蓄積し、より大きなバッファを libavcodec の avcodec_decode_video 関数に送ります。

しかし、私はここで安っぽい写真を手に入れています。一番上の部分、水平バー-非常に鮮明な写真で、残りは安っぽいです。なぜこのように振る舞うかはわかりません。私を助けてください

rtp パケットで取得しているデータは動的 96 です。

注意点:他のメーカーの独自のプロトコルに夢中になっているiframeとpフレームを渡すと、ffmpegは解析して非常に良い写真を提供できます。

どんな助けでも大歓迎です

4

1 に答える 1

9

AXIS IP カメラの MPEG4 ストリーム設定をいじってみてください。これを設定するビデオと画像/詳細部分に注意してください。

  1. ビデオ オブジェクト タイプ: SIMPLE
  2. [x] ISMA準拠
  3. GOV 構造: IP

また、「優先度」または「ビデオ ストリームの最適化」設定を変更してみてください (フレーム レート、画質、帯域幅、なし)。

これでうまくいかない場合は、続きを読む...

MPEG4 ストリームが RTP で転送される仕組みを理解していただければ幸いです。要するに(方法がわからない場合):

  1. 「構成フレーム」(Visual Object Sequence Start) は整数000001B0(16 進数) で始まります。ビデオをデコードするために必要なデータが含まれています。ストリームを初めてデコードしようとするときだけデコーダに送信する必要があり、その後に続くすべての VOP をデコードするために使用されます。AXIS はこのパケットを SDP で送信することに注意してください (RTSP での DESCRIBE への応答) a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21。したがって、ストリームが変更されず、これを SDP で取得している場合は、VOS をデコーダーに渡す必要はありませんが、渡しても問題はありません。

  2. ビデオ オブジェクト プレーン (I-VOP、P-VOP、B-VOP) は整数で始まり000001B6ます。GOV の長さを 10 に設定し、ストリームの構造を「IP」に設定すると、1 つの I フレーム (I-VOP) と 9 つの P-VOP が得られますが、すべてに000001B6開始コードがあります。それらを区別する秘訣は、FIFTH バイトで次の 2 つの BITS をチェックすることです。取得している VOP のタイプを確認するには、次の表を確認してください。

    VOP_CODING_TYPE (binary)  Coding method
                          00  intra-coded (I)
                          01  predictive-coded (P)
                          10  bidirectionally-predictive-coded (B)
                          11  sprite (S)
    

ここで、ビデオをデコードするには、VOS をデコーダーに送信し、その直後に I-VOP を送信する必要があります。しかし、まず、RTP ストリームからこのフレームを抽出する方法が厄介です... I-VOP のサイズが 10000B で、ネットワーク MTU が 1400B の場合、そのまま送信することはできず、ネットワークの輻輳も発生しません。そのため、AXIS カメラは I-VOP と他のすべての BIG フレームを FRAGMENT に分割し、サイズが MTU を超えない RTP パケットとして RTP 経由で送信します。主なアイデアはこれです(例):

  1. 10000B を MTU サイズのフラグメントに分割します (1400B MTU の場合、約 8x [1400B] および 1x [200B] フラグメントを取得します)。
  2. RTP MARKER BIT を 0 に設定して、それぞれを送信します
  3. RTP MARKER BIT を 1 に設定して最後のフラグメントを送信し、最後のフラグメントをマークします。

さて、これを受信すると、ちょっとお分かりになると思いますが、デコーダーがそれをデコードするには、元の 10KB フレームを復元する必要があります。あなたがやっている方法では、はるかに大きなフレームの最初の MTU バイトのみをデコードしており、デコーダーに送信する他のすべてのフラグメントは破棄されます。だから汚い写真が撮れる…

元のフレームを復元するには:

  1. スタートコード000001B6または000001B0RTP MARKER ビットが 0 のパケットを受信します。MARKER が 1 の場合、それはフレーム全体であり、そのままデコードできます。0 の場合、さらにパーツが続きます...
  2. MARKER BIT が 1 に設定されたフラグメントを取得するまで、最初のフラグメントをすべてのフラグメントをバッファーに配置します。最後のフラグメントを取得したら、それをバッファーに配置します。
  3. バッファーには、デコーダーに送信できるフレーム全体が 1 つ含まれるようになりました。

そこに、私が助けてくれることを願っています... :)

于 2011-01-26T09:29:03.310 に答える