File size: 1,124 Bytes
f0743f4 | 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 32 33 34 35 36 37 38 39 40 41 42 | export class MediaSourceAppender {
private readonly mediaSource = new MediaSource();
private readonly audioChunks: ArrayBuffer[] = [];
private sourceBuffer?: SourceBuffer;
constructor(type: string) {
this.mediaSource.addEventListener('sourceopen', async () => {
this.sourceBuffer = this.mediaSource.addSourceBuffer(type);
this.sourceBuffer.addEventListener('updateend', () => {
this.tryAppendNextChunk();
});
});
}
private tryAppendNextChunk() {
if (this.sourceBuffer != null && !this.sourceBuffer.updating && this.audioChunks.length > 0) {
this.sourceBuffer.appendBuffer(this.audioChunks.shift()!);
}
}
public addBase64Data(base64Data: string) {
this.addData(Uint8Array.from(atob(base64Data), (char) => char.charCodeAt(0)).buffer);
}
public addData(data: ArrayBuffer) {
this.audioChunks.push(data);
this.tryAppendNextChunk();
}
public close() {
if (this.mediaSource.readyState === 'open') {
this.mediaSource.endOfStream();
}
}
public get mediaSourceUrl() {
return URL.createObjectURL(this.mediaSource);
}
}
|