WebRTC - API MediaStream
API MediaStream был разработан для облегчения доступа к медиапотокам с локальных камер и микрофонов. Метод getUserMedia () - это основной способ доступа к локальным устройствам ввода.
У API есть несколько ключевых моментов -
Медиа-поток в реальном времени представлен объектом потока в виде видео или аудио.
Он обеспечивает уровень безопасности за счет разрешений пользователя, запрашивающих пользователя, прежде чем веб-приложение сможет начать выборку потока.
Выбор устройств ввода обрабатывается API MediaStream (например, когда к устройству подключены две камеры или микрофона)
Каждый объект MediaStream включает в себя несколько объектов MediaStreamTrack. Они представляют видео и аудио с разных устройств ввода.
Каждый объект MediaStreamTrack может включать в себя несколько каналов (правый и левый аудиоканалы). Это самые маленькие части, определенные MediaStream API.
Есть два способа вывода объектов MediaStream. Во-первых, мы можем преобразовать вывод в видео или аудио элемент. Во-вторых, мы можем отправить вывод в объект RTCPeerConnection, который затем отправит его удаленному узлу.
Использование MediaStream API
Создадим простое приложение WebRTC. Он покажет элемент видео на экране, спросит у пользователя разрешение на использование камеры и покажет прямой видеопоток в браузере. Создайте файл index.html -
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8" />
</head>
<body>
<video autoplay></video>
<script src = "client.js"></script>
</body>
</html>
Затем создайте файл client.js и добавьте следующее:
function hasUserMedia() {
//check if the browser supports the WebRTC
return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia);
}
if (hasUserMedia()) {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia;
//enabling video and audio channels
navigator.getUserMedia({ video: true, audio: true }, function (stream) {
var video = document.querySelector('video');
//inserting our stream to the video tag
video.src = window.URL.createObjectURL(stream);
}, function (err) {});
} else {
alert("WebRTC is not supported");
}
Здесь мы создаем функцию hasUserMedia (), которая проверяет, поддерживается ли WebRTC или нет. Затем мы обращаемся к функции getUserMedia, где второй параметр - это обратный вызов, принимающий поток, поступающий с устройства пользователя. Затем мы загружаем наш поток в видео - элемент с помощью window.URL.createObjectURL , который создает URL , представляющий объект заданную в параметре.
Теперь обновите страницу, нажмите «Разрешить», и вы должны увидеть свое лицо на экране.
Не забудьте запускать все свои сценарии с помощью веб-сервера. Мы уже установили его в учебнике по среде WebRTC.
MediaStream API
Свойства
MediaStream.active (read only) - Возвращает true, если MediaStream активен, или false в противном случае.
MediaStream.ended (read only, deprecated)- Вернуть true, если завершенное событие было запущено для объекта, что означает, что поток был полностью прочитан, или false, если конец потока не был достигнут.
MediaStream.id (read only) - Уникальный идентификатор объекта.
MediaStream.label (read only, deprecated) - Уникальный идентификатор, присвоенный пользовательским агентом.
Вы можете увидеть, как указанные выше свойства выглядят в моем браузере -
Обработчики событий
MediaStream.onactive- Обработчик активного события, которое запускается, когда объект MediaStream становится активным.
MediaStream.onaddtrack- Обработчик для события addtrack , которое запускается при добавлении нового объекта MediaStreamTrack .
MediaStream.onended (deprecated)- Обработчик завершившегося события, которое запускается при завершении потоковой передачи.
MediaStream.oninactive- Обработчик неактивного события, которое запускается, когда объект MediaStream становится неактивным.
MediaStream.onremovetrack- Обработчик события removetrack , которое запускается при удалении из него объекта MediaStreamTrack .
Методы
MediaStream.addTrack()- Добавляет объект MediaStreamTrack, указанный в качестве аргумента в MediaStream. Если трек уже был добавлен, ничего не происходит.
MediaStream.clone() - Возвращает клон объекта MediaStream с новым идентификатором.
MediaStream.getAudioTracks()- Возвращает список аудиообъектов MediaStreamTrack из объекта MediaStream .
MediaStream.getTrackById()- Возвращает трек по ID. Если аргумент пуст или идентификатор не найден, возвращается значение null. Если несколько треков имеют одинаковый идентификатор, возвращается первый.
MediaStream.getTracks()- Возвращает список всех объектов MediaStreamTrack из объекта MediaStream .
MediaStream.getVideoTracks()- Возвращает список объектов видео MediaStreamTrack из объекта MediaStream .
MediaStream.removeTrack()- Удаляет объект MediaStreamTrack, указанный в качестве аргумента, из MediaStream. Если трек уже удален, ничего не происходит.
Чтобы проверить указанные выше изменения API, измените index.html следующим образом:
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8" />
</head>
<body>
<video autoplay></video>
<div><button id = "btnGetAudioTracks">getAudioTracks()
</button></div>
<div><button id = "btnGetTrackById">getTrackById()
</button></div>
<div><button id = "btnGetTracks">getTracks()</button></div>
<div><button id = "btnGetVideoTracks">getVideoTracks()
</button></div>
<div><button id = "btnRemoveAudioTrack">removeTrack() - audio
</button></div>
<div><button id = "btnRemoveVideoTrack">removeTrack() - video
</button></div>
<script src = "client.js"></script>
</body>
</html>
Мы добавили несколько кнопок, чтобы опробовать несколько API MediaStream. Затем мы должны добавить обработчики событий для нашей вновь созданной кнопки. Измените файл client.js таким образом -
var stream;
function hasUserMedia() {
//check if the browser supports the WebRTC
return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia);
}
if (hasUserMedia()) {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia;
//enabling video and audio channels
navigator.getUserMedia({ video: true, audio: true }, function (s) {
stream = s;
var video = document.querySelector('video');
//inserting our stream to the video tag
video.src = window.URL.createObjectURL(stream);
}, function (err) {});
} else {
alert("WebRTC is not supported");
}
btnGetAudioTracks.addEventListener("click", function(){
console.log("getAudioTracks");
console.log(stream.getAudioTracks());
});
btnGetTrackById.addEventListener("click", function(){
console.log("getTrackById");
console.log(stream.getTrackById(stream.getAudioTracks()[0].id));
});
btnGetTracks.addEventListener("click", function(){
console.log("getTracks()");
console.log(stream.getTracks());
});
btnGetVideoTracks.addEventListener("click", function(){
console.log("getVideoTracks()");
console.log(stream.getVideoTracks());
});
btnRemoveAudioTrack.addEventListener("click", function(){
console.log("removeAudioTrack()");
stream.removeTrack(stream.getAudioTracks()[0]);
});
btnRemoveVideoTrack.addEventListener("click", function(){
console.log("removeVideoTrack()");
stream.removeTrack(stream.getVideoTracks()[0]);
});
Теперь обновите свою страницу. Нажмите кнопку getAudioTracks () , затем нажмите кнопку removeTrack () - аудио . Теперь аудиодорожка должна быть удалена. Затем проделайте то же самое с видеодорожкой.
Если вы нажмете кнопку getTracks () , вы должны увидеть все MediaStreamTracks (все подключенные видео- и аудиовходы). Затем щелкните getTrackById (), чтобы получить аудио MediaStreamTrack.
Резюме
В этой главе мы создали простое приложение WebRTC, используя MediaStream API. Теперь у вас должен быть четкий обзор различных API MediaStream, обеспечивающих работу WebRTC.