Используя MediaRecorder API, я смог закодировать страницу, захватывает видео с веб-камеры / мобильной камеры и сохраняет видео на локальном диске. Фрагмент кода выглядит следующим образом:
let mediaRecorder;
let recordedBlobs;
window.addEventListener('load', async () => {
const constraints = {
audio: true,
video: true
};
await init(constraints);
});
async function init(constraints) {
const stream = await navigator.mediaDevices.getUserMedia(constraints);
handleSuccess(stream);
}
function handleSuccess(stream) {
window.stream = stream;
const camVideo = document.querySelector('video#vidCamera');
camVideo.srcObject = stream;
}
function startRecording(mime) {
recordedBlobs = [];
let options = { mimeType: 'video/webm;codecs=vp9,opus'};
mediaRecorder = new MediaRecorder(window.stream, options);
mediaRecorder.ondataavailable = handleDataAvailable;
mediaRecorder.start();
}
function handleDataAvailable(event) {
if (event.data && event.data.size > 0) {
recordedBlobs.push(event.data);
}
}
Это хорошо работает, и я загружаю файл после того, как видео записано, и он отлично воспроизводится. У меня вопрос по качеству видео:
Игнорируя любые ограничения системных / мобильных ресурсов, я хочу настроить свойства MediaRecoder для создания видео (записи) с максимально возможным качеством. Я понимаю, что это решается путем передачи соответствующих параметров, которые в моем случае равны { mimeType: 'video/webm;codecs=vp9,opus'}
. Я пробовал разные и записал на каждый по 10 секунд (см. Размеры):
options = { mimeType: 'video/webm;codecs=avc1,opus'}; //904KB
options = { mimeType: 'video/webm;codecs=h264,opus' }; //923KB
options = { mimeType: 'video/webm;codecs=vp9,opus' }; //1951KB
options = { mimeType: 'video/x-matroska;codecs=avc1' }; //917KB
options = { mimeType: 'video/webm;codecs=vp8,opus' }; //2687KB
options = { mimeType: 'video/webm;codecs=avc1' }; //917KB
options = { mimeType: 'video/webm;codecs=h264' }; //919KB
options = { mimeType: 'video/webm' }; //906KB
options = { mimeType: '' }; //896KB
Все вышеперечисленные видео имеют рамку высота x ширина 480 x 640. Обратите внимание, я нигде не задавал эти размеры в коде.
Я вижу максимальный размер вырабатывается vp8, opus.
- Значит ли это, что видео высочайшего качества получается при сочетании vp8 и opus?
- Если это не так, какая комбинация видео / аудиокодеков даст наивысшее качество?
- А как насчет габаритов, разве они не должны быть больше? Или это зависит от устройства / машины, которые я использую?
Я проверил Рекомендации по высококачественной видеопрезентации здесь, но не приводится пример комбинации опций. Я уже пробовал avc1, опус выше, и он произвел только видео 904 КБ.
Цель состоит в том, чтобы выбрать комбинацию видео / аудиокодеков для создания видео самого высокого качества, при котором, как я предполагаю, он будет иметь максимальный размер среди всех видео.
РЕДАКТИРОВАТЬ:
В итоге я выбрал vp8, opus со следующими ограничениями.
Параметры:
let options = { mimeType: 'video/webm;codecs=vp8,opus' };
Ограничения:
const constraints = {
audio: true,
video: {
height: { min: 720, max: 1280 },
width: { min: 1080, max: 1920 },
frameRate: { min: 15, ideal: 24, max: 30 },
facingMode: "user"
}
}
В результате получилось видео высокого качества, которым я остался доволен. Также обратите внимание на тип (mp4), используемый в коде, где записанные фрагменты превращаются в blob.
Blob:
const blob = new Blob(recordedBlobs, { type: 'video/mp4' });