30 FPS のビデオ ストリームをレンダリングし、リアルタイムでWebM Byte Streamにエンコードして多重化するサーバー アプリケーションがあります。
クライアント側では、HTML5 ページがサーバーに対して WebSocket を開き、接続が受け入れられるとストリームの生成を開始します。ヘッダーが配信された後、後続の各 WebSocket フレームは単一の WebM SimpleBlock で構成されます。キーフレームは 15 フレームごとに発生し、これが発生すると新しいクラスターが開始されます。
クライアントはMediaSourceも作成し、WS からフレームを受信すると、コンテンツをアクティブなバッファーに追加します。は<video>
、最初のフレームが追加された直後に再生を開始します。
すべてが合理的に機能します。私の唯一の問題は、ネットワークのジッターにより、しばらくすると再生位置が実際の時間からずれることです。私の現在の解決策は、イベントにフックし、着信クラスターの とタイムコードupdateend
の違いを確認し、許容範囲外の場合は手動で更新することです。残念ながら、これにより、かなり不快な再生の顕著な一時停止とジャンプが発生します。video.currentTime
currentTime
ソリューションも少し奇妙に感じます。最新のキーフレームがどこにあるかは正確にわかっていますが、(W3C 仕様に従って) 1 秒に変換してから に渡す必要がcurrentTime
あります。最も近いキーフレームを見つけます。
私の質問は次のとおりです。メディア要素に常に利用可能な最新のキーフレームを探すように指示したり、再生時間をシステムクロック時間と同期させたりする方法はありますか?