【问题标题】:Tell whether video is loaded or not in Javascript用 Javascript 判断视频是否已加载
【发布时间】:2012-01-30 21:15:02
【问题描述】:

所以,我一直在使用监听器

document.getElementById("video").buffered.length

查看视频加载时间是否大于0。这适用于非常小的视频,并且仅适用于 Google Chrome。它在 Firefox 中根本不起作用。关于如何让它发挥作用的任何想法?

我基本上想等到 3 个单独的视频加载完毕后再执行特定操作,我该怎么做?

【问题讨论】:

    标签: javascript html video loaded


    【解决方案1】:

    试试这个:

    var video = document.getElementById("video-id-name");
    
    if ( video.readyState === 4 ) {
        // it's loaded
    }
    

    在这里阅读:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/readyState

    【讨论】:

    • 哪些浏览器支持该属性?
    • @JaredFarrish 根据这个Wiki,支持是完整的(WebKit 列是空的,但如果他们的实施落后于 Mozilla/Opera 的,我会感到惊讶)。
    • @ŠimeVidas 如果有超过 1 个视频,如何使用它。 ?谢谢
    • 这个答案没有意义。这并不是真正在倾听变化。这只会在页面第一次加载时运行,如果它立即准备好,它只会工作。
    • @Omar 你是对的。当发布真正的解决方案时,我可以删除我的答案。
    【解决方案2】:

    更新:

    正如其他人所提到的,我下面的原始解决方案确实有效,但它可能会导致性能问题和一些不可预测的行为。

    因此我建议收听loadeddata 事件。 在这里阅读更多:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/loadeddata_event

    const videoElement = document.getElementById("my_video");
    
    videoElement.addEventListener('loadeddata', (e) => {
       //Video should now be loaded but we can add a second check
    
       if(videoElement.readyState >= 3){
           //your code goes here
       }
    
    });
    

    ====================================

    劣质解决方案:

    我发现使用setInterval 可以主动收听视频的readyState 何时更改,每半秒检查一次,直到它加载。

    checkforVideo();
    
    function checkforVideo() {
        //Every 500ms, check if the video element has loaded
        var b = setInterval(()=>{
            if(VideoElement.readyState >= 3){
                //This block of code is triggered when the video is loaded
    
                //your code goes here
    
                //stop checking every half second
                clearInterval(b);
    
            }                   
        },500);
    }
    

    如果您不使用 ES6,只需将 () => 替换为 function()

    【讨论】:

    • 很好的答案!仅供参考,这一切都是检查视频元素的一个简单属性。它使用非常少的处理能力,所以检查之间真的不需要等待半秒。您可以将其更改为 10 毫秒,并几乎在视频加载的那一刻捕捉到视频。
    • 这是个坏蛋。
    • 这个答案很棒,但它阻塞了主线程,我试图在那里显示一个微调器......微调器动画每秒都会冻结。
    • @DuckDucking 你是对的。使用setInterval 可能会完成工作,但远非理想。我使用不会导致性能问题的新改进解决方案更新了我的答案。
    【解决方案3】:

    为了使它成为一个监听器,在正常情况下,你需要监听挂起事件。当下载因任何原因(包括下载完成)暂停或停止时触发。

    您还需要在内容已经加载(例如,从缓存中)的情况下收听播放

    video.addEventListener("playing", function() {
        console.log("[Playing] loading of video");
        if ( video.readyState == 4 ) {
            console.log("[Finished] loading of video");
        }
    });
    video.addEventListener("suspend", function(e) {
        console.log("[Suspended] loading of video");
        if ( video.readyState == 4 ) {
            console.log("[Finished] loading of video");
        }
    });
    

    来源:https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events

    【讨论】:

      【解决方案4】:

      在视频元素上使用 onloadeddata 事件。它检查视频是否已加载。请参阅this reference 了解更多信息。

      当媒体当前播放位置的帧完成加载时触发loadeddata事件;通常是第一帧。

      var video = document.getElementById("video");
      video.onloadeddata = function() {
          // video is loaded
      }
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      • 好吧,我很快就研究了这个提示,在我的情况下,它被证明是最好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多