H265WebビデオプレーヤーEasyPlayer.jsがVR再生プロジェクトで2つのflvライブブロードキャストを切り替えることができないという問題のトラブルシューティング

EasyPlayer.jsプレーヤープロジェクトはすでにVR再生をサポートしているとお話ししましたが、デバッグプロセス中に、VRビデオストリームの再生プロセス中にhlsライブブロードキャストとflvライブブロードキャストを切り替えることができるとユーザーからのフィードバックがありましたが、flvライブブロードキャストが別のライブブロードキャストに切り替えられましたflvライブブロードキャストが無効です。予備的な判断は、私たち自身のプロジェクトコードにバグがあるということです。調査は次のとおりです。

  watch:{
    VrUrl(newVal, lodVal){
      if (lodVal !== newVal) {
        this.playerUrl = this.VrUrl
        this.initURl()
      }
    },
    initURl() {
      if (this.VrUrl !== '') {
        this.playerUrl = this.VrUrl
        if (this.vr.flvPlayer||this.vr.hlsPlayer) this.isDestroy()
        if (this.isHLS) this.playerHLS()
        if (this.isMP4) this.playerMP4()
        if (this.isFLV) this.playerFLV()
        this.callbackFunc()
      }
    },
    isDestroy() {
      if (this.vr.hlsPlayer) {
        this.vr.hlsPlayer.destroy()
        this.vr.hlsPlayer = null
      }
      if (this.vr.flvPlayer) {
        this.vr.flvPlayer.destroy();
        this.vr.flvPlayer = null
      }
    },
    playerFLV() {
      this.vr.play(this.VrUrl, this.vr.resType.flvVideo, {muted: (this.muted == 'false'|| this.muted == false), autoplay: (this.autoplay == 'false'|| this.autoplay == false) });
      this.vr.flvPlayer._config.enableStashBuffer = true;
      this.vr.flvPlayer._config.lazyLoad = true
      this.vr.flvPlayer._config.lazyLoadMaxDuration = 30
      this.vr.flvPlayer._config.lazyLoadRecoverDuration = 2
      this.vr.flvPlayer._config.deferLoadAfterSourceOpen = true
      this.vr.flvPlayer._config.autoCleanupMaxBackwardDuration = 3 * 60
      this.vr.flvPlayer._config.autoCleanupMinBackwardDuration = 2 * 60
      this.vr.flvPlayer._config.statisticsInfoReportInterval = 600
      this.vr.flvPlayer._config.fixAudioTimestampGap = true 
    
    },

切り替えプロセスを要約すると、ライブブロードキャストアドレスを切り替えるときは、最初に前のhlsプレーヤーまたはflvプレーヤーを破棄してから、新しい再生アドレスに従って対応する新しいプレーヤーを再初期化します。

次に、スイッチが失敗したときのBUGの理由は2つあります。1つは古いプレーヤーが破棄に失敗したこと、もう1つは古いプレーヤーが正常に破棄されたにもかかわらず、新しく作成されたプレーヤーが失敗し、以前の構成が引き続き使用されることです。

以下の手順に従って分析します。

(1)、vr定義を見つける

_this.vr = new VR(scene, renderer, container, { fov: 100 });

vrはオープンソースプロジェクトのmxreality.js再生ライブラリを使用していることがわかりました。

(2)mxreality.js再生ライブラリのソースコードを入力し、破棄場所で古いプレーヤーを印刷して、破棄が成功したことを確認します。新しいプレーヤーの作成場所で、再生アドレスを印刷して、新しいアドレスを見つけます。確かに渡されます。それで、問題はどこにありますか?少なくともこれまでのところ、プロジェクトコードにBUGがないことを確認でき、mxrealityにBUGがあると疑われるだけです。

(3)mxrealityオープンソースプロジェクト自体がhlsライブスイッチングの例を示しています。これに基づいて、flvのスイッチングをテストしたところ、実際に切り替えることは不可能であることがわかりました。Githubでmxrealityの作成者と通信した後、研究開発で切り替えが提案された場合、vr.flvPlayerを破棄するのではなく、vr全体を破棄します。テスト後、これは実際に正常に切り替えることができますが、コストが高すぎます。これは、ページ全体を更新するのと同じです。研究開発へのさらなるフィードバックとして、彼は将来最適化する時間があると述べました。現在、このバグは自分でしか解決できません。

(4)mxrealityソースコードでflvライブ放送を再生するためのコードは次のとおりです。

                } else if (that.resType.flvVideo == resType) {
                    if (!flvjs.isSupported()) {
                        console.error('Your browser does not support flvjs')
                        return;
                    }
                    that.flvConfig.url = recUrl;
                    that.flvPlayer = flvjs.createPlayer(that.flvConfig);
                    that.flvPlayer.attachMediaElement(video);
                    that.flvPlayer.load();
                    that.flvPlayer.play();

ここでのflvPlayerはflv.jsを使用していますが、attachMediaElement(video)ビデオがクリーンアップされていない可能性がありますか?変更して強制的に動画を初期化し、バグが残っていることを確認してください。ここで、flv.jsソースコードにバグがあるのではないかと疑う必要があります。

(5)flv.jsソースコードを入力し、例を使用して2つのflvライブブロードキャストアドレスを切り替え、正常に切り替えられることを確認します。切り替え方法はmxrealityソースコードと同じです。調査は行き詰まっていますが、バグがまだmxrealityにあることは確かです。

(6)mxrealityのGithubで、すべての問題を参照して、利益があるかどうかを確認しました。あるネチズンは次のように述べています。

78.png

また、F12でコンソールを開いたところ、予期しないゲインが発生しまし
た。flvライブブロードキャストアドレスを切り替えた後、以前のライブストリームデータは停止しましたが、新しいライブストリームは引き続き以前のアドレスを要求していました。しかし、flv.jsはcreateingPlayerのときに実際に新しいアドレスに切り替えました。

(7)、バグを修正

                    that.flvConfig.url = recUrl;
                    that.flvPlayer = flvjs.createPlayer(that.flvConfig);
                    that.flvPlayer.attachMediaElement(video);
                    that.flvPlayer.load();
                    that.flvPlayer.play();

追跡後、that.flvConfigは、古いflv再生フラグメントを含むsegments属性を持つflv.jsによって更新されることがわかりました。新しいプレーヤーはURLを変更したばかりです。再生を開始した後、flv.jsは最初にセグメント内のセグメントを見つけて再生を続行し、スイッチが失敗する原因になります。解決策は非常に簡単です。flv.jsライブブロードキャストアドレスを切り替えるときは、that.flvConfigを再初期化します。

おすすめ

転載: blog.csdn.net/TsingSee/article/details/114979347
おすすめ