【问题标题】:Wait until an HTML5 video loads等到加载 HTML5 视频
【发布时间】:2012-12-01 15:14:22
【问题描述】:

我有一个视频标签,当我让用户从数据库中的多个视频中进行选择时,我会动态更改其来源。问题是当我更改 src 属性时,即使我告诉它,视频也不会加载。

这是我的代码:

$("#video").attr('src', 'my_video_'+value+'.ogg');
$("#video").load();
while($("#video").readyState !== 4) {
        console.log("Video is not ready");
};

代码仍然处于无限循环中。

有什么帮助吗?

编辑

致伊恩·德夫林:

//add an listener on loaded metadata
v.addEventListener('loadeddata', function() {
    console.log("Loaded the video's data!");
    console.log("Video Source: "+ $('#video').attr('src'));
    console.log("Video Duration: "+ $('#video').duration);
}, false);

好的,这就是我现在拥有的代码。源打印得很好,但我仍然无法获得持续时间:/

【问题讨论】:

标签: html html5-video


【解决方案1】:

您实际上并不需要 jQuery,因为有一个 Media API 可以为您提供所需的一切。

var video = document.getElementById('myVideo');
video.src = 'my_video_' + value + '.ogg';
video.load();

媒体 API 还包含一个 load() 方法:“导致元素重置并开始从头开始选择和加载新的媒体资源。”

(Ogg 不是最好使用的格式,因为它仅受有限数量的浏览器支持。我建议使用 WebM 和 MP4 来覆盖所有主要浏览器 - 您可以使用 canPlayType() 函数来决定玩哪一个)。

然后您可以等待loadedmetadataloadeddata(取决于您想要什么)事件触发:

video.addEventListener('loadeddata', function() {
   // Video is loaded and can be played
}, false);

【讨论】:

  • 我知道,这就是为什么我说要使用 MP4 和 WebM - WebM 可以在 Firefox 和 Opera 上运行。
  • 谢谢,您的回答似乎对我有所帮助,但不完全是。我已经编辑了问题
  • 好的,打印出来的持续时间是什么?你也不需要 $('video') 的东西,你可以简单地使用:this.src 作为源,this.duration 作为持续时间,因为 this = v 和 v 是视频的句柄。我认为这是错误的,因为 jQuery $('#video') 不知道 .duration 是什么。
  • 解决这些冲突变量的更好方法可能是$('#myVideo')[0].load(),因为虽然 jQuery 包装器具有 .load() 函数,但您始终可以使用 [index] 语法直接访问底层 DOM 元素。
  • @manishkumar 这是一个 Typescript HTML5 音频包装器gist.github.com/devfred/b34aafcb4402ac318ecaaa91f6816fc7 - 可以轻松转换为包装 HTML5 视频 API。
【解决方案2】:

在回答您的问题的最后一部分时,该部分仍未得到解答...当您编写 $('#video').duration 时,您要求的是不存在的 jQuery 集合对象的 duration 属性。本机 DOM 视频元素确实具有持续时间。你可以通过几种方式得到它。

这是一个:

// get the native element directly
document.getElementById('video').duration

这是另一个:

// get it out of the jQuery object
$('#video').get(0).duration

还有一个:

// use the event object
v.bind('loadeddata', function(e) {
  console.log(e.target.duration);
});

【讨论】:

  • 对于你的第二种方法,正如上面安东尼提到的,你也可以使用这个语法:$('#video')[0].duration
【解决方案3】:

您可以在video标签的属性中使用preload="none",这样视频只有在用户点击播放按钮时才会显示。

<video preload="none">

【讨论】:

    【解决方案4】:

    加载时调用函数:

    <video onload="doWhatYouNeedTo()" src="demo.mp4" id="video">
    

    获取视频时长

    var video = document.getElementById("video");
    var duration = video.duration;
    

    【讨论】:

    • 在最新的 Chrome (ubuntu,不确定是否具体) 中的视频标签上不会触发此事件
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2016-02-05
    • 2014-07-06
    相关资源
    最近更新 更多