Использовать поток веб-камеры локальной сети в качестве источника для видео в кадре

#html #video-streaming #webcam #aframe #webvr

#HTML #потоковое видео #Вебкам #aframe #webvr

Вопрос:

В настоящее время я работаю над проектом, в котором я управляю роботизированной рукой в виртуальной реальности. Я делаю это с помощью A-Frame и oculus quest 1. Чтобы пользователь мог видеть, что он делает с роботизированной рукой, я хочу транслировать видео с веб-камеры, направленной на руку, в приложение Web-VR. Веб-камера и гарнитура находятся в одной локальной сети, поэтому мне не нужно, чтобы видео было доступно из Интернета.

Что я пробовал для потоковой передачи с веб-камеры до сих пор:

  • поток udp, rtp и srt с использованием OBS со следующим URL:
    • протокол: // 145.89.161.93:8087?режим = прослушиватель
    • протокол: // 127.0.0.1:8087?режим = прослушиватель
    • протокол: //145.89.161.93:8087
    • протокол: //145.89.161.93:8087
  • транслируйте http, rtsp, rtp, udp с помощью vlc media player.

Я пытался просмотреть все потоки obs в vlc, единственным, который, казалось, работал, был поток srt с mode = listener . Но когда я попытался просмотреть этот поток в aframe, у меня ничего не получилось. И теперь obs больше не позволяет мне транслировать с использованием srt (я не знаю почему). Я попытаюсь переустановить obs, чтобы посмотреть, поможет ли это.

Что я пытался просмотреть поток в A-Frame:

 <a-video  src="protocol://145.89.161.93:8087" width="16" height="9" position="0 0 -10"></a-video>
 
 <a-assets>
    <video id="#webcam_stream" src="protocol://145.89.161.93:8087" playsinline> </video>
</a-assets>

<a-video  src="#webcam_stream" width="16" height="9" position="0 0 -10"></a-video>
 

Поток http, похоже, не работает, поскольку сервер, к которому подключается Oculus, запускается с использованием https. Поскольку в противном случае гарнитура не позволит использовать VR. С другими потоками A-Frame, похоже, не выдает ошибку при подключении или неизвестном исходном файле и т. Д. Но он также не отображает поток / видео.

Другие потоки VLC выдают ошибку перекрестного происхождения, но она исчезает, когда я использую crossorigin=»anonymous». Но компонент a-video не может найти ресурс #webcam_stream, если я это сделаю.

Я думаю, что этот урок немного помог бы, даже если это не a-frame. Но html-код не виден, поэтому он не очень полезен.

Я не очень хорошо разбираюсь в веб-разработке и потоковой передаче, но это довольно важная часть нашего проекта. Поэтому любая помощь приветствуется.

Если у кого-нибудь есть решение для отображения потока удаленной веб-камеры в A-Frame, уже существующий код или общее направление / предложение для изучения, это было бы очень оценено.

Ответ №1:

Хорошо, после долгих поисков я нашел решение своей проблемы! Мне пришлось решать множество проблем:

  • html5 поддерживает только ограниченное количество протоколов потоковой передачи
  • Поток должен быть безопасным, поскольку приложение виртуальной реальности размещено с использованием https
  • Нам нужно применить видео к объекту в A-Frame
  • Нам нужно запустить фактический поток.
  • Нам нужна небольшая задержка

Протокол потоковой передачи

Для протокола потоковой передачи я в конечном итоге использовал HLS. По умолчанию он не поддерживается большинством браузеров и HTML5. Но, но с использованием HLS.js мы можем добавить эту поддержку очень легко.

Безопасность

Используя этот протокол, он также решает наши проблемы безопасности. Поскольку потоки HLS — это в основном просто короткие сегменты видео, поставляемые с использованием HTTP / HTTPS-сервера. Поскольку наш сервер представляет собой простой https-сервер, нам нужно только вывести файлы HLS в каталог внутри сервера, чтобы сделать их доступными для приложения.

Если ваш поток находится не на том же сервере, что и ваше приложение, вам нужно будет добавить заголовки CORS на ваш хост HLS для GET запроса. Это требование HLS.js библиотека

Применить видео к объекту в кадре

Чтобы применить поток к объекту в A-Frame, нам нужен <video> ресурс. После загрузки этого ресурса мы можем использовать скрипт для применения потока к ресурсу. Затем мы можем использовать этот ресурс в качестве источника для объектов и текстур.

Приведенный ниже код делает именно это. Поскольку объекты загружаются после ресурсов, добавление компонента к <a-video> объекту вызовет сценарий после загрузки ресурсов. Затем мы можем использовать ресурс в качестве источника для нашей <a-video> сущности.

 <!DOCTYPE html>
<html>
    <head>
        <script src="https://aframe.io/releases/1.2.0/aframe.min.js"></script>
        <script src="hls.js"></script>
        <script>
            AFRAME.registerComponent('hls_stream', {
                init: function(){
                    var video = document.getElementById('webcam_stream');
                    if(Hls.isSupported()) {
                    var hls = new Hls();
                    hls.loadSource('https://ip:port/path_to_hls_file/filename.m3u8');
                    hls.attachMedia(video);
                    hls.on(Hls.Events.MANIFEST_PARSED,function() {
                        video.play();
                    });
                }
                else if (video.canPlayType('application/vnd.apple.mpegurl')) {
                    video.src = 'https://ip:port/path_to_hls_file/filename.m3u8';
                    video.addEventListener('loadedmetadata',function() {
                        video.play();
                    });
                    }
                }
            })
          </script>
    </head>   
    <body>
        <a-scene cursor="rayOrigin:mouse">
            <a-assets>
                <video id="webcam_stream" crossorigin="anonymous"></video>
            </a-assets>

            <a-video src="#webcam_stream" width="16" height="9" position="0 4.5 -20" hls_stream></a-video>

          
            <a-entity id="camera"  wasd-controls camera look-controls></a-entity>
            <a-sky color="#111"></a-sky>
        </a-scene>
    </body>
</html>

 

Как мне выполнить потоковую передачу

В настоящее время я создаю поток HLS с помощью OBS. Вы можете найти, как транслировать HLS с помощью OBS, здесь OBS относительно прост в настройке и позволяет использовать не только веб-камеру, поскольку вы можете захватывать практически любое видео, экран или другой источник ввода с помощью OBS.

Задержка

Единственное, с чем я все еще борюсь, это задержка в потоке OBS. Из-за 2-секундных сегментов и из-за того, что длина списка сегментов потока HLS OBS равна 4, мы обычно получаем задержку около 8 секунд. Это все еще больше, чем я хочу, но пока этого хватит, поскольку запуск потока HLS с низкой задержкой — тема для другого вопроса.

Запуск воспроизведения

По умолчанию в большинстве браузеров автоматическое воспроизведение видеофайлов отключено. Поэтому вам нужно будет вручную запустить video.play() команду, если автоматическое воспроизведение отключено. Или вы можете включить автозапуск в настройках вашего браузера, и видео автоматически запустится.

Комментарии:

1. Спасибо, что поделились! Я пытался пойти в направлении VLC с помощью кодека ogg / theora, если у меня получится что-нибудь полезное (работающее), я добавлю другой ответ 🙂

2. @PiotrAdamMilewski Рад, что смог помочь, я очень рад, что мое решение, по крайней мере, позволяет мне просматривать камеру, но задержка по-прежнему остается проблемой. В настоящее время я читаю в LHLS и dash, которые могут aperantly делать что-то похожее на HLS. Я изучу это в течение следующих дней, обновлю свой браузер новым разделом, если у меня что-нибудь получится.