【发布时间】:2011-06-05 15:40:03
【问题描述】:
我正在尝试构建一个能够连续无缝播放视频 URL 列表的视频定序器。视频之间不能有间隙;播放需要尽可能接近帧精度。
尝试 #1 我使用了一种相当明显和直接的方法,类似于这个线程中提到的方法。 HTML 5 video or audio playlist
这种方法的问题在于,每次一个视频结束且后续视频被指定为新来源时,仍需要加载该新视频,从而导致可能存在较长的间隙。如果可以强制所有视频在 video.src 中命名之前进行预加载,那么这种方法仍然可能有效。
尝试 #2 我重写了脚本,因此列表中的每个视频都会创建一个单独的视频元素,但不会附加到文档(使用 createElement)。然后当每个视频结束时,我删除了前一个节点并附加了下一个元素。
页面加载时执行的代码:
对于(我在时间线播放) if (timelinePlay[i] != null) { var element = document.createElement('video'); element.id = 'video1-' + (i); element.src = 时间线播放[i]['URL']; element.preload = '加载'; video1Array[i] = 元素; }视频“结束”事件的代码:
videoElement.addEventListener(“结束”,函数(事件){ 如果(this.currentTime > 0) { if (player.hasChildNodes()) while (player.childNodes.length > 0) player.removeChild(player.firstChild); player = document.getElementById('canvas-player'); player.appendChild(video1Array[timelineCurrent]); nextVideo = document.getElementById('video1-' + timelineCurrent); nextVideo.play(); 时间线当前++; } }, 错误的);(请注意,这些代码示例是部分的并且有些简化。另外,我确实意识到我将对象用作关联数组并不是最佳实践)
这种修改的结果更接近了,因为视频现在在需要播放的时候加载了,但视频之间仍然存在短暂且不一致的间隙。
尝试 #3 我用 'timeupdate' 监听器替换了 'ended' 事件监听器,开始如下:
nextVideo.addEventListener("timeupdate", 函数(事件) { if (this.currentTime > (this.duration - 0.1) && this.currentTime > 1) { this.removeEventListener("timeupdate", function () { return; }, false);('this.currentTime > 1'只是为了保证之前的视频真正播放)
我希望视频之间的差距足够接近以保持一致,以便在上一个视频结束前任意 0.1 秒开始下一个视频可以将差距纠正到可接受的程度。结果是时机确实更好,但它正在跳过视频。我将跳过的视频归因于“timeupdate”事件的失败,但我可能弄错了。
我还考虑过的其他替代方案: SMIL 脚本(似乎已经过时,并且可能无论如何都会有相同的同步问题) 后端的 ffmpeg 连接视频(我的主机不允许 shell 脚本)
仅供参考,我目前正在为 Safari 5.0.3 开发
【问题讨论】:
标签: javascript html html5-video