CSS властивості
ГлавнаяCanvasДоступ до веб-камери через getUserMedia()

Доступ до веб-камери через getUserMedia()

165

getUserMedia

Історично єдиним способом взаємодії з локальними ресурсами в Інтернеті є завантаження файлів. Єдині локальні пристрої з якими ви можете дійсно взаємодіяти — це миша та клавіатура. На щастя, це не так. У попередньому розділі ми бачили як управляти аудіо. У цьому розділі ми поговоримо про веб-камеру користувача.

Передусім хочу наголосити, що все це ще альфа-версія. API для розмови через локальні пристрої неодноразово змінювалися і, ймовірно, змінюватимуться не раз, перш ніж вони стануть стандартом. Крім того, лише десктопна версія Chrome і Opera має реальну підтримку для розмови через веб-камеру. Фактично немає підтримки на телефонах. Використовуйте цей розділ як спосіб побачити, що настане в майбутньому і отримайте задоволення граючи з кодом, але в жодному разі не використовуйте в робочому коді. Як згадувалося, давайте повеселимося!

У доступу до локальних пристроїв з веб-сторінки довге і строкате минуле. Традиційно це було прерогативою лише плагінів, таких як Flash та Java. Ситуація багато в чому змінилася кілька років тому. Група WebRTC націлилася дозволити комунікацію в реальному часі в Інтернеті. Подумайте про відео-чати та пряму трансляцію концертів. Одним із необхідних компонентів для цього є доступ до веб-камери. Сьогодні ми можемо зробити це за допомогою navigator.getUserMedia().

Я збираюся показати вам метод, який працює в останній версії Chrome. Більш надійне рішення показано в цій статті на HTML5 Rocks. Також зверніть увагу, що getUserMedia не працюватиме з локальними файлами. Ви повинні запускати все на локальному веб-сервері.

Для початку нам знадобиться елемент <video> на сторінці. Там буде відображатися веб-камера.

<code data-language="html"><video autoplay></video>

Щоб отримати доступ до веб-камери, ми повинні спочатку подивитися, чи є підтримка через navigator.webkitGetUserMedia !=null. Якщо існує, ми можемо запросити доступ. options визначає, що нам потрібно: аудіо, відео або те й інше. На момент написання статті тільки аудіо не працює в Chrome.

<code data-language="javascript">if(navigator.webkitGetUserMedia!=null) ; //запитуємо доступ до веб-камери navigator.webkitGetUserMedia(options, function(stream) { //отримуємо тег video var video=document.querySelector('video'); //включаємо потік у магічний URL video.src=window.webkitURL .createObjectURL(stream);}, function(e) { console.log("error happened"); }); }

При викликі webkitGetUserMedia відкривається діалогове вікно, в якому користувача запитують, якщо наша сторінка може отримати доступ. Якщо користувач схвалює тоді викликається перша функція. Якщо виникли проблеми, то буде викликана функція помилки.

Тепер у нас є потік, який ми можемо приєднати до елемента <video> на сторінці , за допомогою магічного URL через webkitURL.createObjectURL(). Після підключення елемент <video> покаже живий вигляд з веб-камери.

Ось як це виглядає:

Проста веб-камера

Проста веб-камера

Створення знімка

Тепер ми маємо живий потік веб-камери, але що ми можемо з цим зробити? Коли це відбувається, елемент <video> чудово відтворює на полотні. Ми можемо зробити знімок із веб-камери просто намалювавши на полотні елемент.

<code data-language="html"><form><input type='button' id='snapshot' value="snapshot"></form> <canvas id='canvas' width='100' height='100'></canvas> <script> document.getElementById('snapshot').onclick=function() { var video=document.querySelector('video'); var canvas=document.getElementById('canvas'); var ctx=canvas.getContext('2d'); ctx.drawImage(video,0,0); }
</script>

При натисканні на кнопку її обробник подій захопить елемент <video> зі сторінки та намалює його на полотні. Ми використовуємо той самий виклик drawImage(), що і для статичних зображень. Через цю функцію ми можемо маніпулювати картинкою аналогічно роботі із зображеннями. Для розтягнення змініть виклик drawImage на наступний:

<code data-language="javascript">//вихідне відео змінює розмір на 100x100 ctx.drawImage( video,0,0,100,100);

Розтягнутий знімок

Розтягнутий знімок

Ось і все. Веб-камера це просто зображення. Ми можемо модифікувати його, використовуючи деякі ефекти, описані у розділі про буфер пікселів. Код нижче інвертує знімок.

<code data-language="javascript">var video=document.querySelector('video'); var canvas=document.getElementById('canvas'); var ctx=canvas.getContext('2d'); ctx.drawImage(video,0,0); //отримуємо дані полотна var data=ctx.getImageData(0,0,canvas.width,canvas.height); //інвертуємо кожен піксель for(n=0; n<data.width*data.height; n++) { var index=n*4; data.data[index+0]=255-data.data[index+0]; data.data[index+1]=255-data.data[index+1]; data.data[index+2]=255-data.data[index+2]; //don't touch the alpha } 
//встановлюємо дані назад ctx.putImageData(data,0,0);

Інвертований знімок

Інвертований знімок

Ви можете робити це живо неодноразово захоплюючи відео, а не тільки коли користувач натиснув кнопку.

Більше крутих хаків

Те, що я показав вам, це тільки верхівка айсберга можливостей. Ось ще кілька прикладів, створених іншими талановитими розробниками. src="/assets/images/canvasdeepdive/webcamtoy.jpg" alt="webcamtoy.com">

webcamtoy.com

Soundstep.com створив ксилофон, яким ви керуєте, просто переміщуючи руки перед веб-камерою. Зверніть увагу на датчик руху глядача в правому нижньому кутку. /p>

Ксилофон на Soundstep.com

Мікрофон насправді поки що не працює. Ви не можете поки що підключити його до аудіо-матеріалів через баги, але сподіваюся це зміниться найближчим часом.