Безопасный контекст: функция ограничена безопасными средами (HTTPS) в некоторых поддерживаемых браузерах. Медиа разработка. Методы GetUserMedia() запрашивают у пользователей разрешение на вывод мультимедиа и создают потоки мультимедиа, содержащие запрошенные типы мультимедиа. Этот поток может содержать, например, фильм (созданный с использованием оборудования или виртуальной видеосистемы, такой как камера или устройство записи звука) или звуковую дорожку записи (аналогичную запись компьютерной звуковой дорожки. Он возвращает промисы, разрешенные в медиапотоках.

Характеристики
Интерфейс камеры обеспечивает простой способ захвата видео, аудио и фотографий. Он предоставляет несколько устройств, которые можно использовать для съемки, включая встроенные камеры или внешние веб-камеры. Интерфейс устройства аудиозаписи возвращает входной сигнал микрофона в виде выходного потока аудиосэмплов. Вы можете использовать эти API, например, на веб-сайте, предлагающем пользователям возможность записывать свой голос, захватывая звук через вход микрофона. В первую очередь они предназначены для приложений, в которых воспроизведение мультимедиа невозможно (например, для игр).

Поскольку getUserMedia() обычно реализуется с использованием кода для конкретной платформы, он может быть доступен не во всех браузерах и устройствах. См. Статус реализации. Вы можете получить размеры исходных размеров (предварительный просмотр) с помощью мультимедийных устройств. получить поддерживаемые ограничения (). ширина и мультимедийное устройство. получить поддерживаемые ограничения (). height Чтобы запросить свойства камеры, используйте вместо этого метод MediaDevices.getCamera().

Пользователь может выбрать тип ввода или вывода, предоставляемый приложением, с помощью параметра ограничений (см. Ограничения). Выбор включает в себя фронтальные камеры, задние камеры, как задние, так и передние камеры, подключенные микрофоны (для записи звука) или внешние устройства, такие как телевизоры. Вы можете использовать эти API, например, в игре, которая использует видео для общения с игроками через их веб-камеры. Примечание. Эта функция еще не обеспечивает доступ ко всем доступным типам оборудования таким образом; см. Интерфейсы, поддерживаемые вашим браузером ниже. Решение для видеоконференций похоже на совместное использование экрана с помощью платформ для видеоконференций. Видеовстречи и видеозвонки — это две функции видеоконференций, которые помогут вам найти лучшие решения для видеоконференций в любой службе видеоконференций.

Хотите сделать свой сайт более интерактивным?
Наши API-интерфейсы камеры и аудиозаписи помогут вам в этом. С помощью этих API вы можете легко добавить на свой веб-сайт возможности записи видео и аудио. Это позволит вашим пользователям снимать фотографии и видео самих себя, а также записывать свой голос. Видеозапись может быть полезна в видеоконференциях, например, в командах Microsoft.

Наши API просты в использовании и обеспечивают отличные результаты. Вам не придется беспокоиться о сложных процедурах настройки или требованиях к кодированию. Просто добавьте наши библиотеки на свою страницу, и все готово.

Конфиденциальность и безопасность
Эти функции являются ненадежными веб-приложениями, поэтому на них распространяются обычные ограничения безопасности, налагаемые Политикой того же источника. Крайне важно, чтобы вы не использовали эти функции для чего-либо конфиденциального.

Как мы тестировали
Этот набор API-интерфейсов сложен, и было сложно протестировать все случаи одновременно. В этой статье обобщается наш подход к тестированию каждой функции, перечисленной в таблице ниже. Мы включили сводку всех соображений безопасности, с которыми столкнулись при тестировании. Примечание. Остается возможным, что при использовании этих функций могут возникать другие, не обсуждавшиеся ранее действия, связанные с безопасностью. Мы планируем включать тесты для них по мере того, как мы сталкиваемся с ними или обнаруживаем их поведение при использовании.

Вопросы безопасности
См. Вопросы безопасности В WebRTC, где getUserMedia() используется с RTCPeerConnection, ограничения применяются как к локальным, так и к удаленным потокам. Когда ограничения применяются только локально, возвращаемый поток не будет иметь внешних ссылок и может использоваться только локально. Когда ограничения применяются как к локальным, так и к удаленным потокам, для выходного потока будет установлено несколько одноранговых соединений, по одному на каждую дорожку мультимедиа.

Ограничения
Укажите ограничения, которые определяют, какие аппаратные устройства могут создавать или потреблять мультимедийные данные (см. Ограничения). Вы также можете одновременно применять ограничения к входным и выходным потокам (см. Первый вариант API getUserMedia()). Для этого укажите свои ограничения в объекте, содержащем каждый параметр ограничения, установленный следующим образом: var options = { audio : true , video : {faceMode : ‘user’ } }; вар обещание = навигатор. медиаустройства . getUserMedia (параметры)

См. Выбор устройства с помощью MediaStreamConstraints.
Первая версия API getUserMedia()

Метод getUserMedia() объекта Navigator принимает объект опций getUserMedia(), возвращает Promise и вызывает обратный вызов успеха с одним параметром: экземпляром MediaStream. Аргумент, передаваемый обратному вызову, будет либо объектом MediaStream, либо нулевым значением. Если нет доступных носителей, аргументу будет присвоено значение null. Эта первая версия не предоставляет доступ к устройствам, кроме входов камеры и микрофона в этом выпуске. В более поздних версиях мы ожидаем, что этот API предоставит доступ к большему количеству типов устройств. Примечание. Мы реализовали ограничения несколькими способами для разных браузеров и платформ, поэтому не думайте, что они одинаковы для всех текущих реализаций! См. Интерфейсы, поддерживаемые вашим браузером ниже.

Поддержка интерфейса
Интерфейс getUserMedia() поддерживается во всех браузерах, которые поддерживают выбор устройства MediaDevices (см. Выбор устройства) и API RTCPeerConnection (для голосового чата). В настоящее время поддержка видео ограничена последними мобильными телефонами, настольными компьютерами или платформами Xbox; см. Интерфейсы, поддерживаемые вашим браузером.

Поддерживаемые типы носителей
В настоящее время мы тестируем только… “видео” Мы предоставляем примеры тестирования ограничений для каждой основной реализации браузера, когда… “Ограничения” BUG=299577 , 587663 NOTRY=true См. Ошибка 299577: побочные эффекты getUserMedia() без ограничений.

Интерфейсы, поддерживаемые вашим браузером WebRTC
WebRTC getUserMedia() поддерживается в Chrome, Firefox и Opera 15+. См. WebRTC getUserMedia(). Медиаустройства

Конструктор MediaStream поддерживается во всех браузерах, поддерживающих интерфейс navigator.getUserMedia(). См. Медиастрим. RTCPeerConnection

RTCPeerConnection с каналами данных поддерживается в Chrome. Поскольку в настоящее время он не реализован для случаев использования голосового чата, мы сосредоточились здесь на случае с видео. См. Одноранговое соединение с использованием RTCPeerConnection без сигнального сервера.

Соображения безопасности
Нам неизвестно о каких-либо проблемах безопасности, характерных для этого набора функций, кроме общих для клиентского JavaScript в целом. Примечание. По мере добавления более сложных ограничений следует учитывать связанные с ними проблемы безопасности. Например, если нам нужно раскрыть идентификаторы аппаратных устройств (например, серийные номера), мы должны рассмотреть, какие проблемы безопасности могут возникнуть в результате раскрытия такой информации веб-контенту.

Получить камеру/видео
Функция getUserMedia() в MediaDevices возвращает обещание. Обратный вызов успеха принимает экземпляр MediaStream, который представляет поток с камеры (камер) и/или микрофона (ов).

Обратные вызовы
У нас есть два обратных вызова для этого API: первый — onSuccess, а второй — onError. Если что-то пойдет не так (например, недопустимые параметры), вы получите сообщение об ошибке (например, InvalidStateError). Если камеры недоступны или пользователь не дал согласия на использование своей веб-камеры, мы ожидаем, что null будет передан в ваш обратный вызов onSuccess. Этот возвращаемый объект содержит всю необходимую информацию о том, какие устройства и возможности были протестированы и выбраны. Возвращенный объект MediaStream будет содержать всю информацию, необходимую для отображения ваших потоков на странице (см. WebRTC).

Обратный вызов успеха
Когда getUserMedia() завершится успешно, он передаст экземпляр MediaStream в ваш обратный вызов onSuccess. Это обычный MediaStream с возможностями и настройками, соответствующими тому, что было выбрано для среды пользователя. Он также содержит устройство, которое однозначно идентифицирует это устройство захвата в рамках данного сеанса браузера. Этот идентификатор может измениться, когда другой вызов getUserMedia() переключается между устройствами захвата или когда запускается или переходит к другому сеансу браузера. Например, если для equest_1 созданы два обратных вызова, то последующие переходы между вкладками приведут к выбору двух потоков: equest_1, а затем equest_2. Это важно учитывать, если вы используете веб-камеру в качестве устройства для разговора по нажатию, потому что она может динамически меняться между обратными вызовами без вашего ведома! Примечание:

Почему вы должны доверять нам?
Нам не известно о каких-либо конкретных проблемах или проблемах с этим набором функций, кроме общих для клиентского JavaScript в целом. Мы выборочно проверяем, что возвращенные потоки MediaStream имеют ожидаемую ширину и высоту, но их размер может быть изменен после передачи в ваш обратный вызов. Также возможно, что соответствующее устройство не имеет видеопотока, поэтому мы всегда возвращаем null в нашем обратном вызове onSuccess(), если камера не найдена.

Предупреждение. Как отмечалось ранее в разделе «Соображения безопасности», существуют некоторые проблемы безопасности, связанные с раскрытием идентификаторов оборудования (например, серийных номеров) для веб-контента. Один из подходов заключается в том, чтобы getUserMedia() возвращал только устройства с идентификаторами, подходящими для использования третьими лицами, а не раскрывал фактические идентификаторы оборудования (например, серийные номера).

Что вы можете делать с моей камерой/микрофоном?
Агент пользователя отслеживает, какие устройства захвата мультимедиа используются для каждого источника.

Это означает, что когда веб-страница отображается на вкладке, один и тот же набор устройств захвата доступен для всех фреймов на странице. Это упрощает просмотр страниц в нескольких окнах или их открытие в новых вкладках. Примечание Агент пользователя отслеживает, какие устройства захвата мультимедиа используются для каждого источника, но не для разных источников. Если два сайта, запрашивающие доступ к камере, загружены из разных источников, то сценарий уровня приложения, работающий на одном сайте, не сможет узнать, какое устройство используется другим сайтом, даже если он использует один и тот же сеанс. Кроме того, сценарий уровня приложения для видеоконференций не может узнать, когда другой сайт в том же сеансе получил доступ к одному из его устройств.

Информация о глубинном потоке
Если вы запросите камеру глубины, вы получите несколько битов информации о ней: maxDepth, NearestDepth и normalizedDist. Если запрошенное вами устройство не имеет потока глубины, то он будет нулевым или неопределенным. В качестве метрики расстояния используется максимальное значение всех пикселей во всех кадрах. Минимальная проверяемая разница между любыми двумя образцами считается 1 единицей в этом числовом пространстве. Другими словами, если два образца ближе, чем minPixelDepth / kMaxPixelDifference, они оба вернут одно и то же значение.

Нормализованные значения глубины NormalizedDist — это нормализованное значение с плавающей запятой расстояния между этим пикселем и ближайшим пикселем в любом потоке глубины. Ограничения minPixelDepth/kMaxPixelDifference для этого значения строго применяются ко всем пикселям; никакие два образца никогда не получат значения normalizedDist, которые слишком близки друг к другу (т. е. меньше, чем minPixelDepth или больше, чем kMaxPixelDifference).

Ближайшая глубина Если на вашем устройстве нет потока глубины, значение параметра NearestDepth равно нулю или не определено. В противном случае это объект, содержащий следующие поля: lowValue — минимальный известный безопасный диапазон для объектов переднего плана highValue — максимальный известный безопасный диапазон для объектов переднего плана extLowValue — минимально возможный диапазон, если подключенное оборудование поддерживает extHighValue — максимально возможный диапазон, если подключенное оборудование поддерживает это

Доступность потоков глубины Хотя некоторые камеры вообще не имеют доступной информации о глубине, доступность обычно объявляется через событие onloadeddata видеопотока (см. MediaDevices.ondatadevicesuccess). Если устройство не поддерживает поток глубины, оно вернет null в getCapabilities().

Какой вариант использования имела в виду рабочая группа?
Это позволяет создать новый класс приложений, которые могут обрабатывать произвольные визуальные носители, включая эффекты глубины для художественных целей: приложение может позволить пользователю рисовать и «взаимодействовать» со статическими изображениями и видео. Интерактивные учебные материалы. Лучшее программное обеспечение для видеоконференций может позволить пользователям интерактивно исследовать 3D-модели под разными углами.

Приложения пространственной дополненной реальности: теперь они работают как настольные браузеры, но они значительно выиграют от полного аппаратного отслеживания + ускорения. Особенно те, кто использует несколько экранов/камер глубины для создания гибридных впечатлений AR/VR. Представьте себе веб-средство просмотра САПР, в котором вы можете просматривать свой проект в реальном размере, комментировать его прямо на нем и т. д. Многопользовательские общие виртуальные пространства: веб-игры MMO с 3D-сценами, где у каждого игрока есть «окно». в мир», они могут видеть и делиться. В этих случаях было бы важно, чтобы разные пользователи не имели возможности ни вмешиваться, ни узнавать о присутствии других пользователей.

Приложения для исследования мультимедиа. Разработчикам нужна возможность создавать захватывающий опыт на основе фотографий и видео. Пользователи должны иметь возможность ходить по пространству, заглядывать за объекты и т. д. Эти приложения для видеоконференций нуждаются в точном отслеживании в пространстве с камерами с широким полем зрения, получающими для этой цели поток с нескольких устройств одновременно.

Какие существуют требования безопасности?
Ничего не меняется в том, к чему вы можете получить доступ, или как здесь работают разрешения по сравнению с использованием WebRTC getUserMedia(). Это по-прежнему выполняется через запрос navigator.mediaDevices, который запрашивает аудио или видео, и, если это разрешено, он направляется в RTCPeerConnection.

Камеры глубины работают так же, как и другие типы медиа, за исключением одной детали… Изображения глубины не в реальном времени. Данные, которые они предоставляют, являются статическими — изображение/сетка, представляющая сцену, которую вы видите в некотором полезном разрешении. Нет причин думать о них как о «живых» вещах, которые влияют на то, что вы видите на экране, поэтому параметр камеры, передаваемый в createMediaStreamSource(), включает только deviceId — здесь нет необходимости указывать конкретное имя потока, поскольку все, что вы получаете будет доступен через все потоки с ненулевым идентификатором (см. MediaDevices.on изменение данных).

Технология для реализации
Предлагаемый API представляет собой очень тонкую оболочку текущего интерфейса getUserMedia() для видео. В основном это просто добавление кадра глубины в качестве дополнительного типа объекта, который вы можете запросить из своего медиапотока. Взамен вы получаете дополнительный атрибут «глубина» для объектов MediaStreamTrack, которые были переданы в createOffer(). Этот атрибут представляет собой новый тип дорожки под названием DepthDataTrack, который содержит объект, похожий на обещание, называемый DepthDataFrame.

Трек данных о глубине DepthDataTrack заключает в себе один DepthDataFrame и предоставляет его свойства в виде именованных атрибутов, доступных только для чтения: maxDepth — максимальный диапазон для этого пикселя. пиксель был сэмплирован. API не указывает, как это генерируется, но вы, вероятно, можете предположить, что он каким-то образом отслеживает время кадра для вашего варианта использования.

DepthDataFrame Объект DepthDataFrame имеет пять свойств, доступных только для чтения, которые раскрывают его содержимое пользовательскому коду: слева — положение этого пикселя в физическом пространстве. справа — соответствующее значение справа вверху — ориентация, в которой камера удерживалась во время захвата. (используя гравитацию в качестве оси Z) спереди — насколько далеко объекты находятся перед камерой на основе ее оптических характеристик сзади — та же идея для объектов позади вас Многие веб-камеры не поддерживают все эти значения, поэтому разработчики должны убедиться, что они сообщают мин. /max варьируется с помощью getDepth() и depthMax, чтобы избежать сокрытия содержимого или запуска дефектов, сообщая разработчикам, что вещи ближе, чем они есть на самом деле. DepthDataFrames может включать в себя дополнительные значения (и камеры могут предоставлять еще больше данных), но сейчас предложение позволяет использовать только этот базовый набор.

Примеры реализации
Такая система требует общих стандартов, поэтому не существует «родной» реализации, которую можно использовать без поддержки WebRTC/getUserMedia(). Mozilla работает с членами Khronos Group (группа отраслевых стандартов, отвечающая за OpenGL) над новым API под названием OpenXR, который должен предоставить все эти возможности в будущей спецификации.

Предлагаемое в настоящее время расширение getUserMedia() не включает поддержку каких-либо носителей на основе глубины, кроме того, что сейчас существует в WebRTC. Однако стандарт уже позволяет расширениям добавлять новые типы мультимедиа, указывая тип MIME в обмене предложением/ответом.

Совместимость с браузером
На практике это будет то, что Chrome реализует раньше других браузеров, но Firefox работает над добавлением поддержки мультимедиа на основе глубины в getUserMedia() с конца прошлого года, и скоро он должен появиться в сети. Чтобы убедиться, что вы можете брать видео из одного браузера и загружать его в другой, не сталкиваясь с ошибками, и в то же время допуская адаптацию контента, где это необходимо, мы должны указать, какое подмножество общих возможностей должны предоставлять все реализации. К сожалению, здесь нет простого пути — мы не можем написать спецификацию с такими требованиями, как «100% покрытие», потому что то, что означает «покрытие», полностью зависит от реализации. В худшем случае людям придется писать код, работающий на нескольких движках, просто для выполнения базовых задач, таких как масштабирование видеоконференций с одного устройства на другое.