我在 4.4.2 的其他问题中注意到了这种行为,问题似乎因设备和制造商而异。通过实验,我注意到以下几点:
- 进入或退出全屏似乎会重置渲染器。我怀疑这会迫使浏览器创建一个新视图或其他东西
- 重新加载视频似乎有助于渲染器
- 改变来源似乎让事情变得更糟
我们的产品本质上是在播放列表上工作的——当ended
一个视频的事件触发时,我们更改视频src
并调用.load()
并.play()
转到下一个。在某些设备上,如果第一个src
是 HLS 视频播放正常,但如果第一个src
是 mp4 或 webm,则切换到 HLS 会导致您丢失视频。在其他设备上,这是相反的行为——从 HLS 开始失败,但切换到它成功。在某些设备上,如果您在开始播放之前进入全屏状态,HLS 会有视频,而在其他设备上,如果您在开始播放后进入全屏状态,则只有在 HLS 上才有视频。在某些设备上,全屏按钮会在您开始播放后消失。
这并不理想,而且老实说非常hacky,但我想出了这个丑陋的解决方案:
// 1.
video.addEventListener('click', requestFullScreen);
// 2.
function requestFullScreen() {
video.removeEventListener('click', requestFullScreen);
video.webkitRequestFullScreen();
}
// 3.
function reloadVideo() {
var ext = video.src.substr( video.src.lastIndexOf('.') ).toLowerCase();
if( ext == '.m3u8' ) {
video.load();
video.play();
}
}
// 4.
video.addEventListener('webkitbeginfullscreen', reloadVideo, false);
video.addEventListener('webkitendfullscreen', reloadVideo, false);
// 5.
video.addEventListener('webkitfullscreenchange', reloadVideo, false);
- 这是为了修复“在某些设备上开始播放后全屏按钮消失”的错误
- 我们给这个函数一个名字,以便我们以后可以删除它。如果他们要求退出全屏,那么如果全屏按钮消失,他们不会责怪您的播放器。在这一点上,他们会责怪手机,他们会刷新页面。这样,如果人们在尝试滚动时不小心再次全屏显示,他们就不会生气
- 一个辅助函数。我们不想在全屏时重新启动视频,除非我们必须这样做
- 股票互联网浏览器抛出这两个事件
- Chrome 抛出此事件
我还必须实施许多其他技巧。例如,Galaxy S4 上的普通 Internet 浏览器在ended
视频结束时并不总是抛出事件。出于这个原因,我setInterval
每 1 秒检查一次。如果视频在最后 1 秒内移动了不到 0.5 秒并且从未暂停(我在resume
和pause
事件中设置了一个标志),那么假设你已经结束了。