Fix MediaStreamTracks not being stopped inside of the worker (fixes #204)

This commit is contained in:
Vanilagy
2025-11-02 13:00:38 +01:00
parent a14c0885d7
commit 5039c730bf
3 changed files with 31 additions and 8 deletions
+1 -1
View File
@@ -115,7 +115,7 @@
return ctx.canvas;
},
*/
width: 300,
//width: 300,
//alpha: 'keep',
//width: 320,
//discard: true,
+22 -3
View File
@@ -14,6 +14,24 @@
source: new Mediabunny.BlobSource(file),
});
const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Mediabunny.VideoSampleSink(videoTrack);
console.log(await videoTrack.getDecoderConfig())
const sink2 = new Mediabunny.EncodedPacketSink(videoTrack);
for await (const packet of sink2.packets()) {
console.log(packet.data.join(', '))//, window.findNalUnitsInLengthPrefixed(packet.data, 4).map(x => window.extractNalUnitTypeForAvc(x)));
if (packet.timestamp > 1) break;
}
//return;
for await (const sample of sink.samples()) {
console.log(sample);
}
/*
let total = 0;
input.source.onread = (start, end) => {
total += end - start;
@@ -22,6 +40,7 @@
const videoTrack = await input.getPrimaryVideoTrack();
const sink = new Mediabunny.EncodedPacketSink(videoTrack);
*/
//console.log(await sink.getPacket(0));
/*
@@ -38,7 +57,7 @@
const stats = await videoTrack.computePacketStats();
//const stats = await videoTrack.computePacketStats();
/*
const sink = new Mediabunny.EncodedPacketSink(videoTrack);
@@ -47,9 +66,9 @@
}
*/
//console.log(await videoTrack.computeDuration());
console.log("Done", stats, total, file.size)
//console.log("Done", stats, total, file.size)
console.log(input);
//console.log(input);
/*
const videoTrack = await input.getPrimaryVideoTrack();
+8 -4
View File
@@ -1159,7 +1159,7 @@ export class MediaStreamVideoTrackSource extends VideoSource {
type: 'videoTrack',
trackId: this._workerTrackId,
track: this._track,
}, [this._track]);
});
this._workerListener = (event: MessageEvent) => {
const message = event.data as MediaStreamTrackProcessorWorkerMessage;
@@ -1978,17 +1978,19 @@ const mediaStreamTrackProcessorWorkerCode = () => {
});
const abortControllers = new Map<number, AbortController>();
const stoppedTracks = new Set<number>();
const activeTracks = new Map<number, MediaStreamVideoTrack>();
self.addEventListener('message', (event) => {
const message = event.data as MediaStreamTrackProcessorControllerMessage;
switch (message.type) {
case 'videoTrack': {
activeTracks.set(message.trackId, message.track);
const processor = new MediaStreamTrackProcessor({ track: message.track });
const consumer = new WritableStream<VideoFrame>({
write: (videoFrame) => {
if (stoppedTracks.has(message.trackId)) {
if (!activeTracks.has(message.trackId)) {
videoFrame.close();
return;
}
@@ -2026,7 +2028,9 @@ const mediaStreamTrackProcessorWorkerCode = () => {
abortControllers.delete(message.trackId);
}
stoppedTracks.add(message.trackId);
const track = activeTracks.get(message.trackId);
track?.stop();
activeTracks.delete(message.trackId);
sendMessage({
type: 'trackStopped',