前端可选的视频直播协议大致只有两种:
- RTMP(Real Time Messaging Protocol)
- HLS(HTTP Live Streaming)
其中RTMP
是 Adobe 开发的协议,无法在 iPhone 中兼容,故目前兼容最好的就是 HLS 协议了。
HTTP Live Streaming(HLS)是苹果公司实现的基于 HTTP 的流媒体传输协议,可实现流媒体的直播和点播。原理上是将视频流分片成一系列 HTTP 下载文件。所以,HLS 比 RTMP 有较高的延迟。
前端播放 HLS
- Native 支持
- Android 3.0+
- iOS 3.0+
- flash 支持
- Flowplayer(GPL
×
) - GrindPlayer(MIT)
- video-js-swf(Apache License 2.0)
- MediaElement.js(MIT)
- clappr(BSD IE10+
×
)
- Flowplayer(GPL
最后,由于 MediaElement 已经纳入 WordPress 的核心视音频库,以及其良好的兼容性(见下图),所以最后选择使用 MediaElement.js 来实现。
切片准备
可使用 m3u8downloader 下载一个 HLS 源,或者使用 node-m3u 生成 m3u8 索引和 MPEG-TS 切片,下面是我们准备切片:
注意看切片索引文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="comment">#EXTM3U</span> <span class="comment">#EXT-X-TARGETDURATION:11</span> <span class="comment">#EXT-X-VERSION:3</span> <span class="comment">#EXT-X-MEDIA-SEQUENCE:0</span> <span class="comment">#EXT-X-PLAYLIST-TYPE:VOD</span> <span class="comment">#EXTINF:10.133333,</span> fileSequence0.ts <span class="comment">#EXTINF:10.000666,</span> fileSequence1.ts <span class="comment">#EXTINF:10.667334,</span> fileSequence2.ts <span class="comment">#EXTINF:9.686001,</span> fileSequence3.ts <span class="comment">#EXTINF:9.768665,</span> fileSequence4.ts <span class="comment">#EXTINF:10.000000,</span> fileSequence5.ts <span class="comment">#EXT-X-ENDLIST</span> |
其中 #EXT-X-ENDLIST
为切片终止标记,如果没有该标记,浏览器会在文件读取完后再请求索引文件,如果有更新则继续下载新文件,以此达到直播效果。
前端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<!DOCTYPE html> <html> <head> <title>player</title> <link rel=<span class="string">"stylesheet"</span> href=<span class="string">"./player/mediaelementplayer.css"</span> /> <style> <span class="comment">/** 隐藏控制条 **/</span> .mejs-controls { display: none !important; } </style> </head> <body> <video width=<span class="string">"640"</span> height=<span class="string">"360"</span> id=<span class="string">"player1"</span>> <source type=<span class="string">"application/x-mpegURL"</span> src=<span class="string">"/m3u8/index.m3u8"</span>> </video> <script src=<span class="string">"http://7.url.cn/edu/jslib/jquery/1.9.1/jquery.min.js"</span>></script> <script src=<span class="string">"./player/mediaelement-and-player.js"</span>></script> <script> <span class="keyword">var</span> player = <span class="keyword">new</span> MediaElementPlayer(<span class="string">'#player1'</span>, { <span class="comment">// 禁止点击暂停</span> clickToPlayPause: <span class="keyword">false</span>, success: <span class="keyword">function</span> (media, ele, player) { <span class="comment">// 初始化后立刻播放</span> player.play(); } }); </script> </body> </html> |