2

HLS 流不播放视频,但播放音频。

设备信息:

三星盖乐世 S5

安卓 4.4.2 / 构建 KOT49H

铬 36.0.1985.131

在其他 Android 版本和设备上播放的 HLS 流:

使用三星 S5 上的浏览​​器应用程序“Internet”,它将播放 HLS 流的视频,这让我认为这可能是 Chrome 的问题,但是,当在具有完全相同 Chrome 构建的 Nexus 5 设备上进行测试时(Android 4.4.4 除外)并且视频播放正常。

Android 问题队列有问题 63810:Android KitKat 上的 HLS 直播中没有视频,我已尽我所能。

我可以做些什么来获得有关问题性质的更多信息?

这是 Android 4.4.2 Samsung S5 的合法错误吗?

4

2 回答 2

2

我在 4.4.2 的其他问题中注意到了这种行为,问题似乎因设备和制造商而异。通过实验,我注意到以下几点:

  1. 进入退出全屏似乎会重置渲染器。我怀疑这会迫使浏览器创建一个新视图或其他东西
  2. 重新加载视频似乎有助于渲染器
  3. 改变来源似乎让事情变得更糟

我们的产品本质上是在播放列表上工作的——当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);
  1. 这是为了修复“在某些设备上开始播放后全屏按钮消失”的错误
  2. 我们给这个函数一个名字,以便我们以后可以删除它。如果他们要求退出全屏,那么如果全屏按钮消失,他们不会责怪您的播放器。在这一点上,他们会责怪手机,他们会刷新页面。这样,如果人们在尝试滚动时不小心再次全屏显示,他们就不会生气
  3. 一个辅助函数。我们不想在全屏时重新启动视频,除非我们必须这样做
  4. 股票互联网浏览器抛出这两个事件
  5. Chrome 抛出此事件

我还必须实施许多其他技巧。例如,Galaxy S4 上的普通 Internet 浏览器在ended视频结束时并不总是抛出事件。出于这个原因,我setInterval每 1 秒检查一次。如果视频在最后 1 秒内移动了不到 0.5 秒并且从未暂停(我在resumepause事件中设置了一个标志),那么假设你已经结束了。

于 2014-10-14T14:06:56.207 回答
1

我已经成功使用preload="none". 切换到auto只会播放音频,使用none将正确播放视频和音频。这是在三星 S3、Android 4.4.2 上测试的。

编辑:autoplay也导致了这个问题。删除它似乎是必要的。

于 2014-09-29T16:14:09.570 回答