jessibuca
Version:
a h5 live stream player
85 lines (75 loc) • 2.39 kB
text/typescript
import { ERR, StreamingError } from "../../error";
import { concatUint8Array } from "../../utils";
import HlsTsLoader from '../../../demux/hlsTsLoader';
import HlsFmp4Loader from "../../../demux/hlsFmp4Loader";
import { HlsLoader } from '../../index';
interface Player {
debug: {
log: (...args: any[]) => void;
};
}
interface Demuxer {
destroy: () => void;
demux: (videoChunk: Uint8Array | null, audioChunk: Uint8Array | null) => void;
demuxAndFix: (data: Uint8Array, discontinuity: boolean, contiguous: boolean, startTime: number) => void;
_baseDts?: number;
getBuferredDuration?: () => number;
getSampleListLength?: () => number;
getSampleAudioListLength?: () => number;
getSampleVideoListLength?: () => number;
}
export default class Transmuxer {
private readonly hls: HlsLoader;
private readonly player: Player;
private readonly isMP4: boolean;
private _initSegmentId: string;
private readonly TAG_NAME: string;
public _demuxer: Demuxer;
constructor(hls: HlsLoader, isMP4: boolean) {
this.hls = hls;
this.player = this.hls.player;
this.isMP4 = isMP4;
this._initSegmentId = '';
this.TAG_NAME = 'HlsTransmuxer';
if (isMP4) {
this._demuxer = new HlsFmp4Loader(this.hls.player);
} else {
this._demuxer = new HlsTsLoader(this.hls.player);
}
this.player.debug.log(this.TAG_NAME, `init and isMP4 is ${isMP4}`);
}
public destroy(): void {
if (this._demuxer) {
this._demuxer.destroy();
this._demuxer = null as any;
}
}
public transmux(
videoChunk: Uint8Array | null,
audioChunk: Uint8Array | null,
discontinuity: boolean,
contiguous: boolean,
startTime: number,
needInit: boolean
): void {
this.player.debug.log(
this.TAG_NAME,
`transmux videoChunk:${videoChunk && videoChunk.byteLength}, audioChunk:${audioChunk && audioChunk.byteLength
}, discontinuity:${discontinuity}, contiguous:${contiguous}, startTime:${startTime}, needInit:${needInit}`
);
try {
if (this.isMP4) {
this._demuxer.demux(videoChunk, audioChunk);
} else {
this._demuxer.demuxAndFix(
concatUint8Array(videoChunk, audioChunk),
discontinuity,
contiguous,
startTime
);
}
} catch (error) {
throw new StreamingError(ERR.DEMUX, ERR.HLS, error);
}
}
}