Как получить доступ к камере в PWA
Опубликовано: 2020-08-19Оглавление
Доступ к камере, ранее описанный в нашей статье с подробным описанием аппаратных возможностей PWA, является одной из наиболее важных функций, которые мы видим все чаще и чаще. Но правильно интегрировать эту возможность в ваше PWA тоже непростая задача, поэтому в нашей сегодняшней статье мы постараемся провести вас через весь этот процесс:
Предпосылки
- Базовая PWA, которую можно легко создать с помощью ReactJS и нашего письменного руководства.
- Уверенное понимание HTML и JavaScript
Как получить доступ к камере в PWA
Основы
Представляем getUserMedia() — API webRTC
Чтобы получить прямой доступ к камере и/или микрофону, Интернет использует API под названием getUserMedia() , который широко поддерживается почти во всех современных браузерах. Этот API, наряду с RTCPeerConnection и RTCDataChannel , являются частью WebRTC — встроенной в браузеры платформы, обеспечивающей связь в реальном времени.
По сути, API ( navigator.mediaDevices.getUserMedia(constraints) ) запрашивает у пользователя разрешение на доступ к аудио- и видеовходу телефона (например, к микрофону, веб-камере, камере и т. д.). Используя это разрешение, API создает объект JavaScript MediaStream , называемый локальным , которым можно манипулировать в дальнейшем.
Примеры
Скажем, например, у нас есть кнопка:
<button>Показать мое лицо</button>
И нажатие на какую кнопку вызывает метод navigator.mediaDevices.getUserMedia() (без аудиовхода):
navigator.mediaDevices.getUserMedia({
видео: правда
})Черт возьми, мы также можем сходить с ума с ограничениями:
navigator.mediaDevices.getUserMedia({
видео: {
минимальное соотношение сторон: 1,333,
минфреймрейт: 30,
ширина: 1280,
высота: 720
}
}) Кроме того, мы можем указать свойство facingMode в объекте видео, которое сообщает браузеру, какую камеру устройства использовать:
{
видео: {
...
режим облицовки: {
//Используем заднюю камеру
точно: «окружающая среда»
}
}
}Или же
{
видео : {
…
//Используем фронтальную камеру
faceMode: 'пользователь'
}
}Примечания :
- API доступен только для безопасного источника (HTTPS).
- Чтобы получить список поддерживаемых ограничений на текущем устройстве, выполните:
navigator.mediaDevices.getSupportedConstraints()
Сложная часть
Теперь, когда у нас есть четкое представление об основах, давайте перейдем к продвинутой части. В этой части мы попробуем создать кнопку в нашем PWA, при нажатии на которую он открывает нашу камеру и позволяет нам выполнять дальнейшую работу.
Создание кнопки [Get access to camera]
Во-первых, давайте начнем с <button> в нашем index.html:
<button>Получить доступ к камере</button> <автовоспроизведение видео></видео> <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
Примечание :
- Автовоспроизведение предназначено для того, чтобы медиапоток автоматически воспроизводился, а не зависал на первом кадре.
- Adapter-latest.js — это прокладка для защиты приложений от изменений спецификаций и различий в префиксах.
Потоковое видео в реальном времени, нажав на кнопку
Чтобы транслировать видео в режиме реального времени при нажатии на кнопку, нам нужно добавить EventListener , который будет вызываться при возникновении события click :

document.querySelector('#get-access').addEventListener('click', асинхронная функция init(e) {
пытаться {
}
поймать (ошибка) {
}
}) После этого он вызывает navigator.mediaDevices.getUserMedia() и запрашивает видеопоток с помощью веб-камеры устройства:
document.querySelector('#get-access').addEventListener('click', асинхронная функция init(e) {
пытаться {
постоянный поток = ожидание navigator.mediaDevices.getUserMedia({
аудио: ложь,
видео: правда
})
const videoTracks = stream.getVideoTracks()
константная дорожка = videoTracks[0]
alert(`Получение видео из: ${track.label}`)
document.querySelector('видео').srcObject = поток
document.querySelector('#get-access').setAttribute('скрытый', правда)
//Видеопоток останавливается функцией track.stop() через 3 секунды воспроизведения.
setTimeout(() => { track.stop() }, 3 * 1000)
} поймать (ошибка) {
предупреждение(`${ошибка.имя}`)
console.error(ошибка)
}
})Кроме того, как указано выше в разделе « Основные », вы также можете указать дополнительные требования к видеопотоку:
navigator.mediaDevices.getUserMedia({
видео: {
обязательно: { minAspectRatio: 1,333, maxAspectRatio: 1,334, faceMode: 'user'},
по желанию: [
{минимальная частота кадров: 60},
{ максширина: 640 },
{ maxHeigth: 480 }
]
}
}, SuccessCallback, errorCallback);Создание холста
С помощью элемента <video> в сочетании с <canvas> вы можете дополнительно обрабатывать наш видеопоток в реальном времени. Это включает в себя возможность выполнять различные эффекты, такие как применение пользовательских фильтров, хроматическая рирпроекция (также известная как «эффект зеленого экрана») — и все это с помощью кода JavaScript.
Если вы хотите узнать больше об этом, Mozilla написала подробное руководство по управлению видео с помощью холста, так что не забудьте его прочитать!
Сделайте снимок холста, используя takePhoto() и grabFrame()
Новые методы takePhoto и grabFrame API getUserMedia можно использовать для захвата моментального снимка текущего потокового видео. Между этими двумя методами все еще есть существенные различия:
По сути, grabFrame кадра просто захватывает следующий видеокадр — упрощенный и не столь эффективный метод захвата фотографий. Метод takePhoto , с другой стороны, использует лучший метод захвата кадров, который заключается в прерывании текущего видеопотока, чтобы использовать «самое высокое доступное разрешение фотокамеры» камеры для захвата изображения Blob.
В приведенных ниже примерах мы будем рисовать захваченный кадр в элемент canvas , используя метод grabFrame :
var grabFrameButton = document.querySelector('button#grabFrame');
var canvas = document.querySelector('canvas');
захватитьFrameButton.onclick = захватитьFrame;
функция захвата кадра () {
imageCapture.grabFrame()
.тогда (функция (изображениеBitmap) {
console.log('Захваченный кадр:', imageBitmap);
холст.ширина = imageBitmap.width;
холст.высота = imageBitmap.height;
canvas.getContext('2d').drawImage(imageBitmap, 0, 0);
canvas.classList.remove('скрытый');
})
.catch (функция (ошибка) {
console.log('Ошибка захвата кадра(): ', ошибка);
});
} И в этом примере мы используем метод takePhoto() :
var takePhotoButton = document.querySelector('button#takePhoto');
var canvas = document.querySelector('canvas');
взятьФотоКнопку.onclick = взятьФото;
// Получить BLOB-объект из выбранного в данный момент источника камеры и
// отображаем это с помощью элемента img.
функция взятьфото() {
imageCapture.takePhoto().then(функция(блоб) {
console.log('Сделано фото:', blob);
img.classList.remove («скрытый»);
img.src = URL.createObjectURL(blob);
}).catch(функция(ошибка) {
console.log('ошибка takePhoto(): ', ошибка);
});
}Чтобы получить представление о том, как вышеперечисленные методы выглядят в действии, мы рекомендуем Simple Image Capture; и, в качестве альтернативы, PWA Media Capture также является хорошим примером того, как может выглядеть базовая функция захвата мультимедиа в PWA.
Вывод
В этом уроке мы познакомили вас с основами, а также с некоторыми дополнительными приемами реализации функций камеры в вашем PWA. Остальное зависит только от вашего воображения, чтобы извлечь максимальную пользу из этой функции.
Для продавцов Magento, желающих разработать магазин нового поколения на базе PWA, здесь, в SimiCart, мы предлагаем полные решения PWA, адаптированные к вашим потребностям.
