AXIS IP カメラの MPEG4 ストリーム設定をいじってみてください。これを設定するビデオと画像/詳細部分に注意してください。
- ビデオ オブジェクト タイプ: SIMPLE
- [x] ISMA準拠
- GOV 構造: IP
また、「優先度」または「ビデオ ストリームの最適化」設定を変更してみてください (フレーム レート、画質、帯域幅、なし)。
これでうまくいかない場合は、続きを読む...
MPEG4 ストリームが RTP で転送される仕組みを理解していただければ幸いです。要するに(方法がわからない場合):
「構成フレーム」(Visual Object Sequence Start) は整数000001B0
(16 進数) で始まります。ビデオをデコードするために必要なデータが含まれています。ストリームを初めてデコードしようとするときだけデコーダに送信する必要があり、その後に続くすべての VOP をデコードするために使用されます。AXIS はこのパケットを SDP で送信することに注意してください (RTSP での DESCRIBE への応答)
a=fmtp:96 profile-level-id=245; config=000001B0F5000001B5891300000100000001200086C40FA28A021E0A21
。したがって、ストリームが変更されず、これを SDP で取得している場合は、VOS をデコーダーに渡す必要はありませんが、渡しても問題はありません。
ビデオ オブジェクト プレーン (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 経由で送信します。主なアイデアはこれです(例):
- 10000B を MTU サイズのフラグメントに分割します (1400B MTU の場合、約 8x [1400B] および 1x [200B] フラグメントを取得します)。
- RTP MARKER BIT を 0 に設定して、それぞれを送信します
- RTP MARKER BIT を 1 に設定して最後のフラグメントを送信し、最後のフラグメントをマークします。
さて、これを受信すると、ちょっとお分かりになると思いますが、デコーダーがそれをデコードするには、元の 10KB フレームを復元する必要があります。あなたがやっている方法では、はるかに大きなフレームの最初の MTU バイトのみをデコードしており、デコーダーに送信する他のすべてのフラグメントは破棄されます。だから汚い写真が撮れる…
元のフレームを復元するには:
- スタートコード
000001B6
または000001B0
RTP MARKER ビットが 0 のパケットを受信します。MARKER が 1 の場合、それはフレーム全体であり、そのままデコードできます。0 の場合、さらにパーツが続きます...
- MARKER BIT が 1 に設定されたフラグメントを取得するまで、最初のフラグメントをすべてのフラグメントをバッファーに配置します。最後のフラグメントを取得したら、それをバッファーに配置します。
- バッファーには、デコーダーに送信できるフレーム全体が 1 つ含まれるようになりました。
そこに、私が助けてくれることを願っています... :)