hjplayer
Version:
hjplayer, a HTML5 Player, can play flv and hls by Media Source Extension, based on typescript;
138 lines (111 loc) • 3.2 kB
text/typescript
import EventEmitter from 'eventemitter3';
import CodecInterface from '../Interfaces/Codec';
import FLVDemuxer from './FLVCodec/Demuxer/FLVDemuxer';
import Events from './FLVCodec/Events/index';
import DefaultConfig from './FLVCodec/config';
import typeSupport from './FLVCodec/Utils/getMediaTypeSupport';
class FLVCodec implements CodecInterface {
/**
* 文件标签
*/
Tag: string
/**
* 类型
*/
type: string
/**
* 事件中心
*/
eventEmitter: EventEmitter
/**
* flv解码器
*/
private _demuxer: FLVDemuxer
/**
* flv解码设置
*/
_config: Record<string, any>
constructor(data: ArrayBuffer, config: Record<string, any>) {
this.Tag = 'FLVCodec';
this.type = 'FLVCodec';
this.eventEmitter = new EventEmitter();
this._config = Object.assign(Object.create(null), DefaultConfig, config);
this._demuxer = new FLVDemuxer(data, this.eventEmitter, config);
}
/**
* 解码器添加数据
* @param data loader 发送过来的数据
* @param byteStart 开始字节
*/
appendData(data: ArrayBuffer, byteStart: number) {
this._demuxer.parseChunks(data, byteStart);
}
resetMediaInfo() {
this._demuxer.resetMediaInfo();
}
insertDiscontinuity() {
this._demuxer.insertDiscontinuity();
}
seek() {
this._demuxer.seek();
}
/**
* 探测数据是否能够解码
* @param data loader第一次发送过来的数据
*/
static probe(data: ArrayBuffer) {
return FLVDemuxer.probe(new Uint8Array(data));
}
on(eventName: string, callback: EventEmitter.ListenerFn) {
this.eventEmitter.on(eventName, callback);
}
once(eventName: string, callback: EventEmitter.ListenerFn) {
this.eventEmitter.once(eventName, callback);
}
off(eventName: string, callback?: EventEmitter.ListenerFn) {
this.eventEmitter.off(eventName, callback);
}
/**
* 销毁功能
*/
destroy() {
this.eventEmitter.removeAllListeners();
this._demuxer.destroy();
delete this.eventEmitter;
}
set timestampBase(base: number) {
this._demuxer.timestampBase = base;
}
set overridedDuration(duration: number) {
this._demuxer.overridedDuration = duration;
}
set overridedHasAudio(hasAudio: boolean) {
this._demuxer.overridedHasAudio = hasAudio;
}
set overridedHasVideo(hasVideo: boolean) {
this._demuxer.overridedHasVideo = hasVideo;
}
/**
* 获取转码事件
*/
static get Events() {
return Events;
}
get config() {
return this._config;
}
static get typeSupportFunc() {
return typeSupport;
}
flushStashedSamples(): void {
this._demuxer.flushStashedSamples();
}
bindDataSource(dataSource: any) {
dataSource.onDataArrival = this.parseChunks.bind(this);
return this;
}
parseChunks(data: ArrayBuffer, byteStart: number): number {
return this._demuxer.parseChunks(data, byteStart);
}
}
export default FLVCodec;