Обработка/получение потока веб-камеры в реальном времени из 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 секунды задержки будет трудно достичь.