Jquery 设置HTML5视频在FF或Safari中不起作用

Jquery 设置HTML5视频在FF或Safari中不起作用,jquery,html,video,html5-video,Jquery,Html,Video,Html5 Video,在www.graysonearle.com/bluemen/index2.html上做这个有趣的网络项目,我遇到了各种各样的问题。SO上的某个人帮助我确保在播放之前加载视频,但这个解决方案只在Chrome上对我有效。 代码如下: for (var i=0;i<16;i++) { document.write('<div class="vidBox" id="box'+i+'">'); document.write(' <vid

在www.graysonearle.com/bluemen/index2.html上做这个有趣的网络项目,我遇到了各种各样的问题。SO上的某个人帮助我确保在播放之前加载视频,但这个解决方案只在Chrome上对我有效。 代码如下:

    for (var i=0;i<16;i++) {
        document.write('<div class="vidBox" id="box'+i+'">');
        document.write('    <video class="vid" loop="loop" preload="metadata" id="vid'+i+'">');
        document.write('    <\/video>');
        document.write('<\/div>');
    }


var xhr = new XMLHttpRequest();
xhr.open('GET', 'videos/fullvid' + ext, true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  if (this.status == 200) {
    console.log("got it");
    var myBlob = this.response;
    var vid = (window.webkitURL ? webkitURL : URL).createObjectURL(myBlob);
    // myBlob is now the blob that the object URL pointed to.
       for (var i=0;i<16;i++) {
        display(i,vid)
   }
  }
};
xhr.send();

       function display(i,vid){

    var video = document.getElementById("vid"+i);
    console.log(video);
    video.src = vid;

}

for(var i=0;i我不确定为什么要使用document.write添加这些,但无论如何,请尝试将自动播放属性添加到视频中,例如

<video controls="controls" autoplay="autoplay">
  Your browser does not support the video tag.
</video>

您的浏览器不支持视频标记。

我可以查看您的doctype吗?请注意,html5的doctype与早期版本的html不同。请检查您的doctype。它应该是

编辑 html5视频的正确标签。我想你可能需要修改你的语法

<video width="320" height="240" controls>
  <source src="movie.mp4" type="video/mp4">
  <source src="movie.ogg" type="video/ogg">
Your browser does not support the video tag.
</video>
除了将视频添加到HTML中的“有趣”方式之外,您还应该依赖于

首先,如果希望视频实际自动加载,请不要使用
preload=“metadata”
,因为这只会加载视频元数据。将preload设置为
“auto”
会有所帮助。或者,您可以完全不使用它,因为
auto
是默认值。(尽管似乎每当Opera添加对此属性的支持时,他们都会将其默认设置为
“metadata”
,因此您最好还是将其显式设置为
“auto”

之后,处理掉整个XHR混乱。然后,您可以执行以下操作:

var videos = document.getElementsByTagName('video');

for(var i = 0, ii = videos.length; i < ii; i++) {
  videos[i].addEventListener('canplaythrough',enablePlayback,false);
}

var videosLoaded = 0;

function enablePlayback(e) {
  videosLoaded++;
  if(videosLoaded === 16) {
    // enable a play button or do whatever you want
    // in this case: start playing all the videos at once
    for(var i = 0, ii = videos.length; i < ii; i++) {
      videos[i].play();
    }
  }
}
var videos=document.getElementsByTagName('video');
对于(变量i=0,ii=videos.length;i
此代码基本上为所有视频添加了一个
canplaythrough
事件的侦听器,然后在每个视频启动时,它们将
videosLoaded
变量增加一个,当最后一个视频调用它时,
videosLoaded
达到16(4x4网格中的视频数量),它将调用
play()
在所有视频对象上

您可能需要对此进行大量的实验才能将其正确(我自己手头没有16个小视频和短视频来充分测试这一点),但这应该会将您带向正确的方向。如果
video.load()
没有下载所有视频,您可能还需要查看
preload=“auto”
(可能会发生,因为它们太多了)


如果
video.load()
preload=“auto”
似乎都不起作用,您可以将所有视频设置为自动播放,然后收听
play
事件并立即暂停(然后删除
play
事件侦听器)。之后,请使用与之前相同的
canplaythrough
代码。

Uh-oh,设置为“我会更改它…”不变。不过,谢谢!您的语法或浏览器版本应该是罪魁祸首。您是否尝试过用纯html测试代码(没有ajax和javascript)。请尝试使用html5在您的网页上播放视频,以查看浏览器的响应。我成功地在我的网页上播放了html5视频,但这些视频都更新到了最新版本。在chrome上,它的工作原理是一样的。它一定与浏览器有关,而不是与您的代码有关。这是一种非常精细的处理浏览器不可用的事实的方法当我有16个视频等待同时播放时,这很好。这会返回什么?console.log(video);在此处运行浏览器测试:尝试以下操作:
videoTag.src=“vid”
videoTag.load();
videoTag.play()
相反,非常感谢您抽出时间。我已经遇到的一个问题是,浏览器在加载8~个视频后就会放弃。这是XHR内容的最初原因,但可能有更好的解决方法。请检查ChromeOh,等等。在重新加载页面几次后,它会工作。也许这个连接很糟糕……让我知道如果对你有用的话。再次感谢。
var videos = document.getElementsByTagName('video');

for(var i = 0, ii = videos.length; i < ii; i++) {
  videos[i].addEventListener('canplaythrough',enablePlayback,false);
}

var videosLoaded = 0;

function enablePlayback(e) {
  videosLoaded++;
  if(videosLoaded === 16) {
    // enable a play button or do whatever you want
    // in this case: start playing all the videos at once
    for(var i = 0, ii = videos.length; i < ii; i++) {
      videos[i].play();
    }
  }
}