Меняется качество MediaRecorder и canvas.captureStream? - PullRequest
0 голосов
/ 17 сентября 2018

Я недавно пытался генерировать видео в браузере, и поэтому играл с двумя подходами:

Поддельный подход работает хорошо, но поддерживается только в Chrome, поскольку это единственный браузер, который в настоящее время поддерживает кодирование webp (canvas.toDataURL("image/webp")). И поэтому я использую captureStream подход в качестве резервной копии для Firefox (и использую libwebpjs для Safari).

Итак, теперь перейдем к моему вопросу: есть ли способ контролировать качество видео потока холста? А если нет, то рассматривало ли что-то подобное браузеры / w3c?

Вот скриншот одного из кадров видео, сгенерированного whammy:

using whammy js library to combine webp frames into webm video

А вот тот же кадр, сгенерированный подходом MediaRecorder/canvas.captureStream:

using MediaRecorder and canvas.captureStream

Моя первая мысль - искусственно увеличить разрешение передаваемого мною холста, но я не хочу, чтобы выходное видео было больше.

Я пытался увеличить частоту кадров, передаваемую методу captureStream (полагая, что может происходить какая-то странная интерполяция кадров), но это не помогает. Это на самом деле ухудшает качество, если я делаю это слишком высоким. Моя текущая теория заключается в том, что браузер выбирает качество потока в зависимости от того, к какой вычислительной мощности он имеет доступ. Это имеет смысл, потому что если он будет соответствовать указанной выше частоте кадров, то что-то должно дать.

Итак, следующая мысль заключается в том, что я должен замедлить скорость, с которой я заполняю холст изображениями, а затем пропорционально снизить значение FPS, которое я передаю в captureStream, но проблема в том, что, хотя Скорее всего, я бы решил проблему с качеством, и в итоге получил бы видео, которое работает медленнее, чем предполагалось.

Редактировать: Вот грубый набросок кода, который я использую, на случай, если он поможет кому-либо в подобной ситуации.

1 Ответ

0 голосов
/ 18 сентября 2018

Это артефакты сжатия, и пока вы ничего не можете сделать ...

Видеокодеки построены в основном с идеей показа реальных цветов и форм, немного похоже на JPEG с действительно низким качеством. Они также сделают все возможное, чтобы сохранить как можно меньше информации между ключевыми кадрами (некоторые используют алгоритм обнаружения движения), чтобы им было необходимо хранить меньше данных.

Эти кодеки обычно имеют некоторые настраиваемые параметры, которые позволят нам улучшить постоянное качество кодирования, но спецификации MediaRecorder, будучи независимыми от кодеков, не предоставили (пока) опции в API для нас, веб-разработчиков установите любую другую опцию, кроме фиксированной скорости передачи (которая здесь нам больше не поможет).

Существует это предложение , которое запрашивает такую ​​функцию, хотя.

...