私が作業しているアプリケーションのために私自身のクライアント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サーバーに入ってくるデータを見ると、私はそれがすべてのものであることがわかります。
何が起こっている可能性がありますか?
返事をいただきありがとうございます。私は実際に問題を解決したばかりで、番号1の回答でそれをカバーしています。私のAVCCアトムは3つの0x00でパッディングされていて、フラッシュ仕様を満たすために4つの0x00をパッディングする必要があったことがわかります!私はアトムの代わりにビデオフレームの作成で何かを探していました。サーバーはデータを何もフォーマットしていないので、データを読み取れませんでした。 – Charlie
ニース、あなたがそれを追跡してうれしい! – fullofsquirrels
申し訳ありませんが、私はそれがまだ選択された答えに賞金を与えたと思った、それはまだそこにあったと言う電子メールを持っていた。あなたにそれを与えることを意味する。 – Charlie