- From: Adam Krebs via GitHub <sysbot+gh@w3.org>
- Date: Tue, 14 Feb 2023 20:21:12 +0000
- To: public-webrtc-logs@w3.org
Thanks for a great lib, @Vanilagy. Helps a ton! I can confirm that using it with MediaStreamTrackProcessor#getReader works as expected.
Here's my example (wrapping @theatrejs):
```ts
import { createRafDriver, ISheet, val } from '@theatre/core'
import { useRef } from 'react'
import WebMMuxer from 'webm-muxer'
export const rafDriver = createRafDriver({ name: 'Hubble rAF driver' })
export const useRenderer = ({
sheet,
fps = 30,
width = 1280,
height = 720,
bitrate = 1e6,
}: {
sheet: ISheet
fps?: number
width?: number
height?: number
bitrate?: number
}) => {
const { sequence } = sheet
const duration = val(sequence.pointer.length)
const totalFrames = duration * fps
// A way for the renderer to signal that the frame has finished drawing
const renderDone = useRef((_a?: unknown) => {})
const frameReady = () => {
return new Promise((resolve) => (renderDone.current = resolve))
}
const captureFrame = () => {
renderDone.current()
}
const startCapture = async ({ canvas }: { canvas: HTMLCanvasElement }) => {
let i = 0
let videoEncoder = new VideoEncoder({
output: (chunk, meta) => muxer.addVideoChunk(chunk, meta, i * fps * 1000),
error: (e) => console.error(e),
})
videoEncoder.configure({
codec: 'vp09.00.10.08',
width,
height,
bitrate,
bitrateMode: "constant"
})
async function encodeFrame(data: VideoFrame) {
const keyFrame = i % 60 === 0
videoEncoder.encode(data, { keyFrame })
}
async function finishEncoding() {
await videoEncoder.flush()
muxer.finalize()
reader.releaseLock()
await fileWritableStream.close()
}
const fileHandle = await window.showSaveFilePicker({
suggestedName: `video.webm`,
types: [
{
description: 'Video File',
accept: { 'video/webm': ['.webm'] },
},
],
})
const fileWritableStream = await fileHandle.createWritable()
const muxer = new WebMMuxer({
target: fileWritableStream,
video: {
codec: 'V_VP9',
width,
height,
frameRate: fps,
},
})
await sheet.project.ready
const track = canvas.captureStream(0).getVideoTracks()[0]
// @ts-expect-error
const mediaProcessor = new MediaStreamTrackProcessor(track)
const reader = mediaProcessor.readable.getReader()
for (i = 0; i < totalFrames; i++) {
sequence.position = i / fps
rafDriver.tick(performance.now())
console.log(`capturing frame ${i}/${totalFrames} at simtime ${i / fps}`)
await frameReady()
// @ts-expect-error
track.requestFrame()
const result = await reader.read()
const frame = result.value
await encodeFrame(frame)
frame.close()
}
finishEncoding()
}
return { startCapture, captureFrame }
}
```
--
GitHub Notification of comment by akre54
Please view or discuss this issue at https://github.com/w3c/mediacapture-record/issues/213#issuecomment-1430325280 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Tuesday, 14 February 2023 20:21:13 UTC