3

AS フレームレート ロジックを追加せずに、NetStream フレームが到着したらすぐに再生する方法を教えてください。

Red5 が受信したプロトコルからいくつかのオーディオ & ビデオ データ パケットを記録しました。現在、タイムスタンプをインクリメントRTMPしてパケットをプッシュすることにより、ループ内のフラッシュ クライアントに送り返そうとしています。NetStreamループ シーケンスの長さは約 20 秒で、約 200 の RTMP パケット (VideoData/AudioData) から構築されます。

環境: localhost 上の Flash クライアントとサーバーの両方、ネットワークのボトルネックなし、ビデオは同じ Flash クライアントによって以前に H.264 でエンコードされています。

一般的には機能しますが、ビデオはあまり流暢ではありません。多くのフリーズ、スローダウン、長い一時停止があります。パケットの送信が遅くなると、一時停止やフリーズが多くなります。、シーケンス全体を 2x ~ 3x 回 (~60 秒) 送信するような非常に長い一時停止でさえ効果なし - これは、1 秒あたり ~2 RTPM パケットよりも低速で転送する場合に発生します。

この問題は、一部の AS ロジックが、受信したフレームを出力するだけでなく、ビデオのフレームレートを強制しようとしているように見えます。速く再生できるのに、遅く再生できないのはなぜですか? ビデオ fps を RTPM パケットのタイムスタンプと同期せずに、「フレーム単位で」ビデオを再生するにはどうすればよいですか?

反対に、パケットをレコーダーよりも速くプッシュすると、ビデオは速くなりますが、ほとんど流暢になります。ストリームを遅くしたり安定させたりすることはできません (それでも非常に不規則な速度です)。

いくつかのNetStream値を分析しました:

  • .bufferLength= ~0 または 0.001、非常に高速にパケットを転送すると増加 (~90fps をターゲットにするなど)
  • .currentFPSVideo=着信フレーム/秒ではなく、オブジェクトで見られる実際の FPS カウントを表示します
  • .info.currentBytesPerSecond= 転送速度に応じて ~8 kB/s ~ ~50kB/s
  • .info.droppedFrames= 2/秒のようにパケットをストリーミングしても、頻繁に増加します! また、長い自己開始一時停止の後にジャンプします (ただし、バッファーはずっと 0 です!)
  • .info.isLive= 真
  • .info.dataBufferLength= と同じ.bufferLength

RTMP パケットの受信が非常にまれであるため、AS がフレームをドロップしているようです。

私の現在の最良のNetStream構成:

chatStream.videoReliable = false;
chatStream.audioReliable = false;
chatStream.backBufferTime = 0;
chatStream.bufferTime =0;

bufferTimeに設定すると1、「1 秒のビデオ」を収集するまでビデオが一時停止れることに注意してください。バッファなしで ~15fps をターゲットにする場合)、バッファは約 10 ~ 20 秒かかります。

もちろん、ループはキーフレーム化されたビデオ データから始まり、シーケンスのキーフレーム間隔は約 15 フレームです。

4

1 に答える 1