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 をターゲットにするなど).currentFPS
Video
=着信フレーム/秒ではなく、オブジェクトで見られる実際の 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 フレームです。