npm.io
1.0.0-rc • Published 6 years ago

@smt-lib/m3u-parser

Licence
ISC
Version
1.0.0-rc
Deps
0
Size
11 kB
Vulns
0
Weekly
0

HLS协议M3U文件解析库

m3u-parser

解释: HLS(http live stream), Apple 公司于2009年提出的基于 HTTP 协议的流媒体协议. 支持度: iOS、MacOSX 及 Apple TV 原生支持; Android 3.0+ 支持.

    它的传输内容包括两部份, 一是 M3U8 描述文件, 二是 TS 媒体文件,这里主要解决 M3U8 描述文件的解析问题

M3U描述文件

M3U8 是 M3U 的 UTF8 编码版本, M3U 是一种列表文件, 只提供一些描述信息.

M3U 文件中可以包含多个 tag, 每个 tag 的功能和属性如下:

#EXTM3U

文件的头部,必须是文件的第一行。

#EXTINF

指示多媒体文件的信息,包括播放时间和标题。

#EXT-X-MEDIA-SEQUENCE:

每一个media URI 在 PlayList 中只有唯一的序号, 相邻之间序号 +1, 一个 media URI 并不是必须要包含的, 如果没有, 默认为 0

#EXT-X-TARGETDURATION:

指定最大的媒体段时间长(秒). 所以#EXTINF中指定的时间长度必须小于或是等于这个最大值. 这个 tag 在整个 PlayList 文件中只能出现一次 (在嵌套的情况下, 一般有真正 TS url 的 m3u8 才会出现该 tag)

#EXTINF: [, ]</strong></p> <p>duration 指定每个媒体段(ts)的持续时间(秒), 仅对其后面的URI有效, title 是下载资源的 url</p> <p><strong>#EXT-X-PROGRAM-DATE-TIME</strong></p> <p>将一个绝对时间或是日期和一个媒体段中的第一个 Sample 相关联, 只对下一个 meida URI 有效 例子: #EXT-X-PROGRAM-DATE-TIME54:23.031+08:00</p> <h5 id="user-content-一个m3u8-index文件示例" data-level="4"><a href="#user-content-一个m3u8-index文件示例">一个m3u8 index文件示例</a></h5> <pre class="hljs"><code class="language-text">#EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:15 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PROGRAM-DATE-TIME52:58.107325501+08:00 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577425980848091643.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0500Z/604800/host/b0572bf3ff1643d95f5f4b64c788461912c2c8e880b003fd7f87fa68a8093f13 #EXT-X-PROGRAM-DATE-TIME53:04.423748954+08:00 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577425985846621096.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0505Z/604800/host/7ede18cc10a376b33ddd3fcb3faad0c75b117d3bebc3118dd955839791bff2fb #EXT-X-PROGRAM-DATE-TIME53:19.473701505+08:00 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577426000864220299.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0520Z/604800/host/21ce1874cc833778edad812a88267769ca48ad879feee9b29acfe416f1928880</code></pre> <h5 id="user-content-ts-媒体文件" data-level="3"><a href="#user-content-ts-媒体文件">TS 媒体文件</a></h5> <p>ts媒体文件是根据业务不同自定义的格式,比如直播消息流的ts文件格式是json string,而视频编码主要格式 h264/mpeg4, 音频为 acc/MP3。由于TS 媒体文件的定制化比较高,这里就不一一介绍了。</p> <h6 id="user-content-npm" data-level="4"><a href="#user-content-npm">npm</a></h6> <p>npm使用方法方法,见<a href="https://docs.npmjs.com/about-npm/index.html" target="_self" title="npm使用说明">npm使用说明</a></p> <pre class="hljs"><code class="language-text">npm install @smt-lib/m3u-parser</code></pre> <h5 id="user-content-示例" data-level="3"><a href="#user-content-示例">示例</a></h5> <pre class="hljs"><code class="language-javascripttheme-peacock"> // m3u-index文件内容 import {parseM3U8Text} from '@smt-lib/m3u-parser'; const m3uIndexText = '#EXTM3U\r\n...'; // 解析后的json格式m3u-index文件 cosnt m3uJson = parseM3U8Text(m3uIndexText); // console.log(m3uJson);</code></pre> <h4 id="user-content-方法" data-level="2"><a href="#user-content-方法">方法</a></h4> <p><strong>parseM3U8Text</strong></p> <p>注册异常监听函数</p> <table> <thead> <tr> <th>字段名</th> <th>类型</th> <th>必有</th> <th>说明</th> </tr> </thead> <tbody><tr> <td>fileText</td> <td>string</td> <td>Y</td> <td>m3u-index文件内容</td> </tr> </tbody></table> <p>返回参数说明</p> <table> <thead> <tr> <th>字段名</th> <th>类型</th> <th>必有</th> <th>说明</th> </tr> </thead> <tbody><tr> <td>version</td> <td>string</td> <td>N</td> <td>含义详见<code>M3U描述文件</code> #EXT-X-VERSION</td> </tr> <tr> <td>duration</td> <td>string</td> <td>N</td> <td>#EXT-X-TARGETDURATION</td> </tr> <tr> <td>sequence</td> <td>string</td> <td>N</td> <td>#EXT-X-MEDIA-SEQUENCE</td> </tr> <tr> <td>fileQueue</td> <td>array</td> <td>N</td> <td>文件队列</td> </tr> </tbody></table> <p>fileQueue-item 项说明</p> <table> <thead> <tr> <th>字段名</th> <th>类型</th> <th>必有</th> <th>说明</th> </tr> </thead> <tbody><tr> <td>item.programTime</td> <td>string</td> <td>N</td> <td>#EXT-X-PROGRAM-DATE-TIME 进度条时间</td> </tr> <tr> <td>item.info</td> <td>object</td> <td>N</td> <td>信息,包含title标题和duration持续时间</td> </tr> <tr> <td>item.path</td> <td>string</td> <td>Y</td> <td>TS文件地址或嵌套m3u地址, <code>注意: path可能不包含host和protocol</code></td> </tr> <tr> <td>item.type</td> <td>number</td> <td>y</td> <td>枚举 0:带进度条型ts文件项,1:不带进度条型ts文件项,2:m3u-index嵌套项</td> </tr> </tbody></table> <pre class="hljs"><code class="language-text">// type=0 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:15 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PROGRAM-DATE-TIME52:58.107325501+08:00 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577425980848091643.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0500Z/604800/host/b0572bf3ff1643d95f5f4b64c788461912c2c8e880b003fd7f87fa68a8093f13 #EXT-X-PROGRAM-DATE-TIME53:04.423748954+08:00 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577425985846621096.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0505Z/604800/host/7ede18cc10a376b33ddd3fcb3faad0c75b117d3bebc3118dd955839791bff2fb #EXT-X-PROGRAM-DATE-TIME53:19.473701505+08:00 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577426000864220299.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0520Z/604800/host/21ce1874cc833778edad812a88267769ca48ad879feee9b29acfe416f1928880 // type=1 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:15 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577425980848091643.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0500Z/604800/host/b0572bf3ff1643d95f5f4b64c788461912c2c8e880b003fd7f87fa68a8093f13 #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577425985846621096.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0505Z/604800/host/7ede18cc10a376b33ddd3fcb3faad0c75b117d3bebc3118dd955839791bff2fb #EXTINF:0.000, /v1/liveshowstatic/3262140290_1577426000864220299.ts?authorization=bce-auth-v1/3a9861ff96dd472f875791b14cb0b6a1/2019-12-27T0520Z/604800/host/21ce1874cc833778edad812a88267769ca48ad879feee9b29acfe416f1928880 // type=2 #EXTM3U #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000 http://example.com/low.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2560000 http://example.com/mid.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=7680000 http://example.com/hi.m3u8 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS="mp4a.40.5" http://example.com/audio-only.m3u8</code></pre>

Keywords