| 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; |
| } |
| }); |
|
|