バグ?最初の一時停止後にネットストリームが再開されず、その後シークします
-
20-09-2019 - |
質問
文書化された知識を見つけることができない奇妙な行動を経験しています。
何が起こっているかは次のとおりです。
Play()メソッドを呼び出した後、NetStatusコードが「netStream.play.start」の場合、ネットストリームは一時停止されます。これにより、自動的に再生されるデフォルトの動作が無効になります。再開する前に どちらか togglePause()またはresume()は、シーク操作を実行します。TogglePause()またはresume()で再開しようとすると、NetStreamは再び再生を開始しません。
すぐに一時停止した場合、その間にSEEK()なしで()resume()を再開すると、正常に再開されます。
また、最初の一時停止を約250ミリ秒遅らせると、問題なく()を探して()resume()をseedします。
ここにデモとソースを投稿しました。http:// Drinkspiller.cannonballinteractive.com/temp/ResumeAfterPauseAndSeek/
このコードは、最初の一時停止を処理してSEEK and Resumeボタンを処理するために、NetStream用のAS3ドキュメントからの直接のコードです。それほど大したことはありません。
stream.seek(0) を呼び出してから stream.pause(); を呼び出して一時停止していることに注意してください。これにより、最初のフレームは、何もないのではなく、ビデオインスタンスに表示されます。同じ動作は、Stream.seek(0)なしで発生し、Stream.Pause()のみを使用して再生を停止します。
また、startPaused(); への呼び出しを遅らせてみました。バッファフルイベントコードがありますが、動作は同じです。
誰かが私が賢明な回避策を見つけたり、これがバグであることを確認するのを手伝ってくれますか?どうもありがとう!
解決
確かにいくつかのバグが存在します (そしてドキュメントが不十分です)。しかし、サンプルには潜在的な問題が 2 つあると思います。
FLV に関するメタデータを受信する前に NetStream.seek を呼び出すのは得策ではないと思います。(継続時間がメタデータから抽出されることを考慮してください)。それに関する公式文書があるかどうかは知りませんが、経験上、問題が発生する可能性があることがわかりました。onMetaData イベント ハンドラーに一時停止/シーク イベントを入れてみるとよいでしょう。
私の限られた理解では、メタデータは FLV データにインラインで含まれているということです。どこにでも置くことができますが、理想的には、通常はファイルの先頭にあります。したがって、プログレッシブダウンロードする場合、NetStream はビデオでより高度な処理 (シークなど) を行うために必要なメタデータを取得するのに十分な情報を受信する必要があります。これで、250 ミリ秒の一時停止を入れたときに機能した理由が説明できるかもしれません。
サンプル FLV は、私が作業した他の FLV とは異なる方法でエンコードされています。理由は正確にはわかりませんが、別の FLV を参照するように変更すると、すべてうまくいきました (つまり、問題 #1 が解決された後です)。
おそらくサンプル FLV に、シークに必要なキーフレームが欠けているのではないかと思いました。キーフレームを含めて再エンコードしようとしましたが、それでも機能しませんでした。その FLV の何が違うのかよくわかりませんが、誰かがそれを指摘できれば、私も非常に役立つと思います。
ポスターフレームがあることを確認するためのseek(0)呼び出しの使用について...私自身はそうする必要はありませんでした。ただし、これは FLV のエンコード方法に関係している可能性もあります。
他のヒント
あなたがnetstream.seekを行う場合は(0);それが再びあなたのメタデータハンドラを呼び出します。