| importScripts('./webm-writer2.js'); | |
| let webmWriter = null; | |
| let fileWritableStream = null; | |
| let frameReader = null; | |
| async function startRecording( | |
| fileHandle, | |
| frameStream, | |
| trackSettings | |
| ) { | |
| let frameCounter = 0; | |
| fileWritableStream = await fileHandle.createWritable(); | |
| webmWriter = new WebMWriter({ | |
| fileWriter: fileWritableStream, | |
| codec: 'VP9', | |
| width: trackSettings.width, | |
| height: trackSettings.height, | |
| }); | |
| frameReader = frameStream.getReader(); | |
| const init = { | |
| output: (chunk) => { | |
| webmWriter.addFrame(chunk); | |
| }, | |
| error: (e) => { | |
| console.log(e.message); | |
| stopRecording(); | |
| }, | |
| }; | |
| const config = { | |
| codec: 'vp09.00.10.08', | |
| width: trackSettings.width, | |
| height: trackSettings.height, | |
| bitrate: 10e6, | |
| }; | |
| let encoder = new VideoEncoder(init); | |
| let support = await VideoEncoder.isConfigSupported(config); | |
| console.assert(support.supported); | |
| encoder.configure(config); | |
| frameReader | |
| .read() | |
| .then(async function processFrame({ done, value }) { | |
| let frame = value; | |
| if (done) { | |
| await encoder.flush(); | |
| encoder.close(); | |
| return; | |
| } | |
| if (encoder.encodeQueueSize <= 30) { | |
| if (++frameCounter % 20 == 0) { | |
| console.log(frameCounter + ' frames processed'); | |
| } | |
| const insert_keyframe = frameCounter % 150 == 0; | |
| encoder.encode(frame, { keyFrame: insert_keyframe }); | |
| } else { | |
| console.log('dropping frame, encoder falling behind'); | |
| } | |
| frame.close(); | |
| frameReader.read().then(processFrame); | |
| }); | |
| } | |
| async function stopRecording() { | |
| await frameReader.cancel(); | |
| await webmWriter.complete(); | |
| fileWritableStream.close(); | |
| frameReader = null; | |
| webmWriter = null; | |
| fileWritableStream = null; | |
| } | |
| self.addEventListener('message', function (e) { | |
| switch (e.data.type) { | |
| case 'start': | |
| startRecording( | |
| e.data.fileHandle, | |
| e.data.frameStream, | |
| e.data.trackSettings | |
| ); | |
| break; | |
| case 'stop': | |
| stopRecording(); | |
| break; | |
| } | |
| }); | |