hls.min.js 是一个用于浏览器中播放 HTTP Live Streaming (HLS) 视频流的JavaScript库,它将复杂的解码工作封装起来,使得网页开发者能够轻松实现视频直播和点播功能。
! !
一个用于处理媒体片段解析的类定义如下:
```javascript
class FragmentHandler {
constructor(observer, supportedTypes, config) {
this.observer = observer;
this.supportedTypes = supportedTypes;
this.config = config;
}
destroy() {}
resetTimeStamp() {}
remux(fragmentData, decryptionKey, ivBuffer, isInitSegment=false, audioTrack=true, videoTrack=true,
otherTracks=[], segmentType=main, customMetadata=null) {
var observer = this.observer;
if (fragmentData.byteLength > 0 && decryptionKey !== null && AES-128 === decryptionKey.method) {
let decrypter = new Decrypter(observer, config);
decrypter.decrypt(fragmentData, decryptionKey.key.buffer, decryptionKey.iv.buffer,
decryptedFragment => this.pushDecrypted(new Uint8Array(decryptedFragment),
decryptionKey, fragmentData));
} else {
this.pushDecrypted(new Uint8Array(fragmentData), decryptionKey, fragmentData);
}
}
pushDecrypted(data, keyInfo, originalData) {
let demuxer = this.demuxer;
if (!demuxer || isInitSegment !== false && !this.probe(originalData)) {
for (let {demux: probeFunction, remux: handler} of [
{demux: $, remux: st},
{demux: H, remux: st},
{demux: tt, remux: st},
{demux: W, remux: ut}
]) {
if (probeFunction(originalData)) {
let handlerInstance = new handler(observer, config.supportedTypes, this.vendor);
demuxer = new probeFunction(observer, handlerInstance, config.supportedTypes);
this.probe = probeFunction;
break;
}
}
if (!demuxer) return observer.trigger(ERROR, {type: MEDIA_ERROR,
details:FRAG_PARSING_ERROR,
fatal:true,
reason:no demux matching with content found});
}
let remuxHandler = this.remux;
(isInitSegment || originalData) &&
[demuxer.resetInitSegment, remuxHandler.resetInitSegment].forEach(fn => fn());
if (isInitSegment) {
[demuxer.resetTimeStamp, remuxHandler.resetTimeStamp]
.filter(Boolean).forEach(fn => fn(keyInfo));
demuxer.setDecryptData && demuxer.setDecryptData(keyInfo);
}
demuxer.append(data, originalData);
}
}
```
此代码段定义了一个`FragmentHandler`类,用于处理媒体片段的解析。它支持加密内容的解密,并根据数据类型选择合适的解析器和重组处理器来处理这些媒体片段。
该类包含的方法如下:
- `destroy`: 释放资源
- `resetTimeStamp`: 重置时间戳
- `remux`: 根据提供的参数调用`pushDecrypted`
- `pushDecrypted`: 处理解密后的数据,通过合适的解析器和重组处理器来处理媒体片段
此外,它还定义了一个辅助函数用于检测并设置适合的数据类型以进行解码。