Add support for writing I-frame only tracks, fix track closing race conditions in other muxers

This commit is contained in:
Vanilagy
2026-03-27 18:48:27 +01:00
parent e2e8aaab78
commit 94678dd356
8 changed files with 200 additions and 30 deletions
+10 -5
View File
@@ -60,6 +60,7 @@ type MpegTsTrackData = {
adtsHeader: Uint8Array | null;
adtsHeaderBitstream: Bitstream | null;
firstPacketWritten: boolean;
closed: boolean;
};
type QueuedPacket = {
@@ -139,6 +140,7 @@ export class MpegTsMuxer extends Muxer {
adtsHeader: null,
adtsHeaderBitstream: null,
firstPacketWritten: false,
closed: false,
};
this.trackDatas.push(newTrackData);
@@ -204,6 +206,7 @@ export class MpegTsMuxer extends Muxer {
adtsHeader: null,
adtsHeaderBitstream: null,
firstPacketWritten: false,
closed: false,
};
this.trackDatas.push(newTrackData);
@@ -498,7 +501,7 @@ export class MpegTsMuxer extends Muxer {
if (
!isFinalCall
&& trackData.packetQueue.length === 0
&& !trackData.track.source._closed
&& !trackData.closed
) {
break outer;
}
@@ -714,15 +717,16 @@ export class MpegTsMuxer extends Muxer {
override async onTrackClose(track: OutputTrack) {
const release = await this.mutex.acquire();
if (this.allTracksAreKnown()) {
this.allTracksKnown.resolve();
}
const trackData = this.trackDatas.find(x => x.track === track);
if (trackData) {
trackData.closed = true;
await this.flushTimestampQueue(trackData, false);
}
if (this.allTracksAreKnown()) {
this.allTracksKnown.resolve();
}
await this.interleavePackets();
release();
@@ -734,6 +738,7 @@ export class MpegTsMuxer extends Muxer {
this.allTracksKnown.resolve();
for (const trackData of this.trackDatas) {
trackData.closed = true;
await this.flushTimestampQueue(trackData, false);
}