Обработка/получение потока веб-камеры в реальном времени из WebRTC или любого механизма захвата на основе браузера на сервере с использованием ASP.NET MVC

Нам нужно захватить живой видеопоток из WebRTC (или любого другого механизма захвата с веб-камеры клиента, даже если он не поддерживается во всех браузерах, а как PoC).

Это живое видео должно обрабатываться серверным компонентом (ASP.Net MVC/Web API), я полагаю, что код на сервере будет выглядеть следующим образом:

[HttpPost]
public ActionResult HandleVideoStream(Stream videoStream)
{
      //Handle the live stream
}

Ищите любое ключевое слово или полезную ссылку.

Мы уже реализовали способ отправки отдельных кадров с использованием base64 jpg, но это совсем не полезно, потому что есть огромные накладные расходы на кодировку base64 и потому, что мы могли бы использовать любую видеокодировку для более эффективного отправки видео ( отправьте различие между кадрами с помощью VPx -vp8- например), требуемому решению необходимо захватить видео с веб-камеры клиента и отправить его в реальном времени (не записано) на сервер (asp.net) в качестве потока -или фрагменты данных, представляющих новые видеоданные -.

Ответы

Ответ 1

Ваш вопрос слишком широк, и запрашивать ресурсы вне сайта считается вне темы в stackoverflow. Чтобы избежать сомнительных высказываний, я ограничу ответ на общие понятия.

Flash/RTMP

WebRTC пока недоступен во всех браузерах, поэтому наиболее широко используемый способ захвата ввода веб-камеры из браузера, который в настоящее время используется, - через плагин. Наиболее распространенное решение использует Adobe Flash Player, нравится это людям или нет. Это связано с поддержкой поддержки кодировки H.264 в последних версиях, а также для AAC, MP3 и т.д. Для аудио.

Потоковая передача выполняется с использованием протокола протокола RTMP, который был первоначально разработан для связи Flash. Протокол работает на TCP и имеет несколько вариантов, например RTMPS (RTMP over TLS/SSL для шифрования), RTMPT (RTMP инкапсулирован в HTTP для обхода брандмауэра).

В потоке обычно используется формат контейнера FLV.

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

На стороне сервера у вас есть два варианта:

  • реализовать базовый сервер RTMP для непосредственного общения с передающей библиотекой и чтения потока
  • используйте один из серверов RTMP с открытым исходным кодом и реализуйте только клиент в ASP (вы также можете перекодировать входящий поток "на лету" в зависимости от того, что вы пытаетесь сделать с вашим приложением).

WebRTC

С помощью WebRTC вы можете:

  • записывайте мелкие фрагменты мультимедиа на таймер и загружайте их на сервер, где реконструируется поток (требуется конкатенация и повторная штамповка кусков во избежание разрывов). См. этот ответ для ссылок.
  • используйте одноранговые возможности связи WebRTC, когда сервер является одним из сверстников.

Возможное решение для второго сценария, который я еще не проверил лично, предложен Адамом Роучем:

  • Браузер получает веб-страницу с javascript в ней.
  • Браузер выполняет javascript, который:
    • Возвращает ручку к камере с помощью getUserMedia,
    • Создает RTCPeerConnection
    • Вызов createOffer и setLocalDescription на RTCPeerConnection
    • Отправляет запрос серверу, содержащему предложение (в формате SDP)
  • Сервер обрабатывает предложение SDP и генерирует собственный ответ SDP, который он возвращает в браузер в своем ответе.
  • JavaScript вызывает setRemoteDescription на RTCPeerConnectionдля запуска потока медиа.
  • Сервер начинает получать DTLS/SRTP пакеты из браузера, который он делает то, что он хочет, вплоть до хранения в легко читаемом формате на локальном жестком диске.

Источник

Это будет использовать VP8 и Vorbis внутри WebM над SRTP (UDP, также может использовать TCP).

Если вы не можете реализовать RTCPeerConnection непосредственно в ASP с помощью обертки, вам понадобится способ перенаправления потока на серверное приложение.

PeerConnection API является мощной функцией WebRTC. В настоящее время он используется версией Google Hangouts в WebRTC. Вы можете прочитать: Как Hangouts использует WebRTC.

Ответ 2

Согласился, что это вопрос вне темы, но я недавно столкнулся с тем же вопросом/требованием, и моим решением было использовать MultiStreamRecorder из WebRTCExperiments. Это в основном дает вам "blob" аудио/видеопотока каждые X секунд, и вы можете загрузить его на ваш ASP.NET MVC или контроллер WebAPI, как показано здесь. Вы можете либо вручную обработать капли на части сервера, либо объединить их в файл, а затем обработать, как только поток остановится. Обратите внимание, что API, используемые в этой библиотеке, не полностью поддерживаются во всех браузерах, например, пока нет поддержки iOS.

Мой анализ на стороне сервера потребовал от пользователя говорить полные предложения, поэтому я также использовал PitchDetect.js для обнаружения молчания в аудиопотоке перед отправкой частичного блоба на сервер. С помощью этого типа настройки вы можете настроить своего клиента на отправку частичных блоков на сервер после завершения разговора, а не через каждые X секунд.

Что касается достижения 1-2-секундной задержки, я бы предложил искать в WebSockets для доставки, а не HTTP POST, но вы должны играть с этими параметрами и выбирать лучший канал для своих требований.

Ответ 3

В настоящее время большинство IP-камер будут использовать кодировку H264 или MJPEG. Вы не знаете, какие камеры используются.

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

Для преобразования/перекодирования есть любое количество медиасерверов, и что-то вроде FFMPEG или Unreal Media Server может преобразовывать, декодировать и т.д. на стороне сервера, чтобы получить его в каком-то формате, с которым вы можете работать. Большинство IP-камер, которые я видел, просто используют веб-браузер с поддержкой H264.

РЕДАКТИРОВАТЬ: Ваш самый большой враг будет вашей задержкой. 1-2 секунды задержки будет трудно достичь.