medialement.js在iPhone上不适用于我的hls

时间:2018-12-17 13:58:14

标签: hls mediaelement.js

这是我的m3u8文件: cat 8.m3u8

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:1131
#EXT-X-TARGETDURATION:5
#EXTINF:4.950, no desc
1545049888215.ts
#EXTINF:4.950, no desc
1545049893218.ts

我将其作为静态文件保存在http://104.248.205.68:31339/8.m3u8

我使用mediaelemnts.js来运行以下hls视频:jsfiddle

html:

<video width="240" height="160"  
    id="player1" src="http://104.248.205.68:31339/8.m3u8" 
    controls="controls" autoplay preload="auto" muted ></video>

js:

  $('video').mediaelementplayer({});

它在chrome mac os桌面上正常工作。但不适用于iPhone 8+(Safari和Chrome)。控制台中没有错误。视频只是没有播放,黑屏。在视频的全屏模式下-相同。

同时,如果我在互联网上找到一个随机的m3u8并使用mediaelemnts.js播放,它在iPhone上运行良好(至少在全屏模式下)jsfiddle 2

所以我猜我的m3u8文件有问题,因为其他m3u8可以在iPhone上运行。

如果在Iphone上加载问题页面时打开网络选项卡,则表明它正在下载文件,但由于某些原因没有显示视频。

enter image description here

更新

我在android系统上进行了检查:Chrome中的galaxy s5和galaxy s9 +:都可以。

更新2

包含ts文件和m3u8的压缩归档文件:http://104.248.205.68:31339/8.m3u8.zip

1 个答案:

答案 0 :(得分:1)

在检查媒体文件[1]时,可以发现PMT(节目映射表)表示流中有音频,但是实际上不存在用于音频的TS数据包(即,没有音频数据)。 / p>

播放器似乎在等待音频TS数据包,以便为音频和视频建立公共缓冲区,然后才开始播放。由于流缺少从未发生的音频数据。要进行备份,可以使用ffmpeg使用以下命令从媒体片段中删除音轨,并发现一旦执行此操作就可以播放。

ffmpeg -i 1545049893218.ts -an -vcodec copy 1545049893218-v.ts

此外,此问题仅在iOS的Safari和Chrome中显示的原因是,在这种情况下,mediaelement.js使用浏览器的本机功能播放HLS,而不是JavaScript播放器(例如hls.js)在其他平台(例如台式机上的Chrome)上使用,并且更能容忍此类问题。

[1]例如使用http://thumb.co.il/ffprobe


编辑:

尽管以上内容足以使其在较旧的Apple移动设备上运行-我在iPhone 6 iOS10上进行了测试-但较新的设备似乎更具限制性。官方HLS Authoring Spec声明

  

8.11。您必须在直播/线性播放列表中至少提供6个细分。

在某些iOS版本上似乎并不是硬性要求。但是,为了确保它可以在所有版本上正常工作,应该满足这些要求。

我在使用iOS12的iPhone X上进行了快速测试,发现只要复制最后一个片段条目,如果播放列表中至少提供了3个片段,它将可以播放。