Files
monibuca/plugin/webtransport/web/example.js
2025-05-06 16:33:31 +08:00

110 lines
2.2 KiB
JavaScript

async function getDisplayMedia() {
return navigator.mediaDevices.getDisplayMedia({
video: {
frameRate: {
ideal: 30,
},
},
audio: {
numberOfChannels: 2,
sampleRate: 44100,
},
});
}
let stream;
let recordingChunks = [];
const myWorker = new Worker("./worker.js");
async function startRecording() {
myWorker.onmessage = (chunk) => {
recordingChunks.push(chunk.data);
};
myWorker.postMessage({ type: "START" });
stream = await getDisplayMedia();
const videoTrack = stream.getVideoTracks()[0];
const audioTrack = stream.getAudioTracks()[0];
if (videoTrack) {
const videoTrackProcessor = new MediaStreamTrackProcessor({
track: videoTrack,
});
videoTrackProcessor.readable.pipeTo(
new WritableStream({
write: (chunk) => {
myWorker.postMessage(
{
type: "DATA_VIDEO",
chunk,
},
[chunk]
);
},
})
);
}
if (audioTrack) {
const audioTrackProcessor = new MediaStreamTrackProcessor({
track: audioTrack,
});
audioTrackProcessor.readable.pipeTo(
new WritableStream({
write: (chunk) => {
myWorker.postMessage(
{
type: "DATA_AUDIO",
chunk,
},
[chunk]
);
},
})
);
}
}
function pauseRecording() {
myWorker.postMessage({ type: "PAUSE" });
}
function resumeRecording() {
myWorker.postMessage({ type: "RESUME" });
}
async function stopRecording() {
try {
myWorker.postMessage({ type: "STOP" });
stream.getTracks().forEach((track) => {
track.stop();
});
// Save the file
const fileHandle = await window.showSaveFilePicker({
suggestedName: "recording.flv",
types: [
{
description: "FLV Video",
accept: { "video/x-flv": [".flv"] },
},
],
});
const writableFileStream = await fileHandle.createWritable();
await writableFileStream.write(new Blob(recordingChunks));
await writableFileStream.close();
recordingChunks = [];
} catch (error) {
console.error("Error stopping recording:", error);
}
}