Я пытался создать базовый медиа-рекордер с помощью MediaRecorder API что довольно просто: получите поток из getDisplayMedia, затем запишите его.
Проблема: записывается только максимальный размер экрана, но не более того. Так что, если мой экран 1280/720, он не будет записывать 1920/1080.
Это может показаться довольно очевидным, но я намерен записать меньшее разрешение внутри большего. Например:
Красный прямоугольник представляет то, что записывает мой фактический экран, а окружающий его черный прямоугольник представляет собой просто черное пространство, но все видео теперь имеет более высокое разрешение, 1920/1080, что полезно для YouTube, поскольку YouTube уменьшает все, что находится в между разрешением 720 и 1080, что является проблемой.
В любом случае я попытался просто добавить поток из getDisplayMedia в видеоэлемент video vid.srcObject = stream
, затем создал новый холст с разрешением 1920/1080, и в цикле анимации просто сделал ctx.drawImage(vid, offsetX, offsetY)
, а вне цикла, где был создан MediaRecorder, просто сделал newStream = myCanvas.captureStream()
согласно документации API, и передал это в MediaRecorder; однако проблема в том, что из-за огромных накладных расходов на холст все работает очень медленно, а частота кадров абсолютно ужасна (нет видео-примера, просто проверьте его сами).
Итак, есть ли способ оптимизировать холст, чтобы не влиять на частоту кадров (пытался заглянуть в OffscreenCanvas, но я не смог найти способ получить поток из него для использования с MediaRecorder, поэтому это не помогло), или есть лучший способ захвата и записи холста, или есть ли лучший способ записать экран с большим разрешением в клиентском JavaScript? Если не с клиентским JavaScript, существует ли какой-нибудь кодировщик видео в реальном времени (ffmpeg слишком медленный), который можно было бы запустить на сервере, и каждый кадр холста можно было бы отправить на сервер и сохранить там? Есть ли лучший способ сделать видеомагнитофон с любым видом JavaScript - клиентом или сервером, или обоими?