2016-10-28 19 views
7

私が作業しているアプリケーションのために私自身のクライアントRTMPライブラリを構築しようとしています。これまでのところ、RTMPサーバーに接続してハンドシェイクをネゴシエートしてから、必要なすべてのパケットを送信すると(FCPublish Publish ETC)、サーバーからNetStream.Publish.StartのonStatusメッセージが得られました私はライブビデオ放送の公開を開始するためにサーバを手に入れることができました。 Wiresharkはまた、情報(/データパケット化)が正確であることを確認します。RTMPインジェストチャンクストリームの問題

ここで、RTMP Chunkingの問題は、Adobe RTMP Specification(17ページ)を参照してください。& 18は、メッセージがどのようにチャンクされるかの例を示しています。この例から、チャンクサイズ(128バイト)に基づいて分割されていることが分かります。私の場合、チャンクサイズは最初の接続と交換で交渉されます。これは常に4096バイトです。したがって、私が4096バイトより大きいビデオデータを交換しているときには、最初の4096バイトのデータをRTMP packetHeaderに送信してから、小さなRTMPヘッダーを0xc4(0xc0 | packetHeaderType(0x04))に送信してメッセージをチャンクする必要があります。ヘッダーで指定されたフルパケットが送信されるまで、4096バイトのビデオデータと組み合わされます。新しいフレームが入ってきて、同じプロセスが繰り返されます。

さまざまな言語で書かれた他のRTMPクライアントの例を調べることによって、これは彼らがすべて行っていることになります。残念ながら、私がストリームしようとしているインジェストサーバは、ブロードキャストビデオデータをピックアップしていません。ビデオを表示していない、またはビデオが正しいという兆候は一切表示されません。 Wiresharkは、ビデオアトムパケットが送信された後、送信されたほとんどのパケットが不明(0x0)で、ビデオデータに切り替わり、未知(0x0)とビデオデータの表示の間にフリップフロップを並べ替えます。しかし、ペイロードの最大サイズを20000バイトに制限すると、Wiresharkはすべてをビデオデータとして表示します。明らかに、取り込みサーバーはこの状況ではビデオを表示しません。なぜなら、20kバイトにすぎないほどのデータを取り除いているからです。

何がうまくいかないのか分かりました。別のxcodeプロジェクトを開始しました。これは私のLAN上でRTMPサーバーをスプーフィングして、サーバーに入ったときのデータがlibRTMP IOSのように見えるようにします。またlibRTMPでは、送信するパケットを記録することができ、サーバーとしてChange Chunkサイズのメッセージを送信した場合でも、128バイトのバイトでも0xc4バイトも挿入するようです。 RTMPクライアントライブラリでこれを複製しようとすると、ちょうど128チャンクサイズを使用しても、それは4096バイトに設定されています。サーバは私の接続を閉じます。しかし、ライブRTMPサーバに移動しようとするlibRTMPを変更すると、それはLibRTMP内で128のチャンクサイズでパケットを送信していることが表示されます。また、サーバはビデオが表示されているので、サーバを受け入れているようです。 RTMPサーバーに入ってくるデータを見ると、私はそれがすべてのものであることがわかります。

何が起こっている可能性がありますか?

答えて

2

私はRTMPに特化していませんが、私はRTSP/RTP/RTCPを非常に幅広く扱ってきました。その経験と私が途中で拾った打撲傷に基づいて、探すに役立つヒント:問題が発生する可能性があります。

  1. あなたのビデオエンコーディングは、サーバーに伝えているものと一致していますか?言い換えれば、あなたのビデオがH.264としてエンコードされている場合は、それがサーバーに何を指定しているのでしょうか?
  2. データは、サーバーが予期しているコンテナ形式と一致していますか?たとえば、サーバがMPEG-4ムービー(.m4v)ファイルを受信する予定で、エンコードされたMPEG-4(.mp4)ストリームのみを送信する場合は、MPEG-4ビデオストリームをカプセル化してMPEG-4ムービーコンテナ。逆に、サーバがMPEG-4ビデオストリームを1つしか期待していないのに、カプセル化されたMPEG-4ムービーを送信している場合は、そのコンテナからMPEG-4ストリームを逆多重化してそのコンテンツのみを送信する必要があります。
  3. 伝送媒体のMTUを考慮しましたか?チャンクサイズにかかわらず、クライアントとサーバ間のMTUの不一致をデバッグするのは難しいかもしれません(おそらく、「Unknown」タイプと「Video Data」タイプの両方に分類されているパケットがいくつか出てくる可能性があります)。これの多くは、MTUが一貫している限り、ほとんどのOSに組み込まれているセグメンテーションと再アセンブリ(SAR)インフラストラクチャで処理されますが、独自のSARロジックを実行する必要がある場合は、違う。
  4. WiresharkでlibRTMP iOSと自分のクライアントでトラフィックをキャプチャして、パケットを並べて比較しようとしましたか?時には "参照"パケットトレースは、もともと重要ではないと思われるビット(または多くのビット)を見つける上で非常に重要です。

幸運!

+0

返事をいただきありがとうございます。私は実際に問題を解決したばかりで、番号1の回答でそれをカバーしています。私のAVCCアトムは3つの0x00でパッディングされていて、フラッシュ仕様を満たすために4つの0x00をパッディングする必要があったことがわかります!私はアトムの代わりにビデオフレームの作成で何かを探していました。サーバーはデータを何もフォーマットしていないので、データを読み取れませんでした。 – Charlie

+0

ニース、あなたがそれを追跡してうれしい! – fullofsquirrels

+0

申し訳ありませんが、私はそれがまだ選択された答えに賞金を与えたと思った、それはまだそこにあったと言う電子メールを持っていた。あなたにそれを与えることを意味する。 – Charlie

関連する問題