使用ASP.NET MVC处理/接收来自WebRTC的实时视频网络摄像头流或任何基于浏览器的捕获机制到服务器

Saw*_*wan 20 c# asp.net asp.net-mvc webrtc asp.net-web-api

我们需要从WebRTC(或客户端网络摄像头的任何其他捕获机制)捕获实时视频流,即使它不是在所有浏览器上都支持,而是作为PoC支持.

这个实时视频需要由服务器组件(ASP.Net MVC/Web API)处理,我想服务器上的代码看起来像:

[HttpPost]
public ActionResult HandleVideoStream(Stream videoStream)
{
      //Handle the live stream
}
Run Code Online (Sandbox Code Playgroud)

寻找任何关键字或有用的链接.

我们已经实现了一种使用base64 jpg发送单个帧的方法,但这根本没用,因为base64编码有很大的开销,因为我们可以使用任何视频编码来更有效地发送视频(发送差异)在使用VPx -vp8-的帧之间,所需的解决方案需要从客户端的网络摄像头捕获视频并将其作为流 - 或数据块实时(未记录)发送到服务器(asp.net)代表新的视频数据.

aer*_*tal 13

您的问题太广泛,并且要求异地资源在stackoverflow上被视为偏离主题.为了避免倾向于意见的陈述,我将限制一般概念的答案.

闪存/ RTMP

WebRTC尚未在所有浏览器上提供,因此从当前使用的浏览器捕获网络摄像头输入的最广泛使用的方法是通过插件.最常见的解决方案是使用Adobe Flash Player,无论是否喜欢它.这是由于H.264在最近的版本编码的支持,伴随着AAC,MP3等音频.

流式传输使用RTMP协议完成,该协议最初设计用于Flash通信.该协议可以工作TCP并具有多种风格,例如RTMPS(RTMPover TLS/SSLfor encryption),RTMPT(RTMP封装在HTTP防火墙遍历中).

流通常使用FLV容器格式.

您可以轻松找到使用Flash捕获网络摄像头输入并将其流式传输到的开源项目 RTMP服务器.

在服务器端,您有两个选择:

  • 实现一个基本RTMP服务器直接与发送库通信并读取流
  • 使用其中一个开源RTMP服务器并实现一个客户端ASP(您也可以根据您尝试使用应用程序的内容,动态转码传入的流).

的WebRTC

随着WebRTC您可以:

  • 在计时器上记录小媒体块并将其上传到重建流的服务器上(需要连接并重新标记块以避免不连续).请参阅此答案以获取链接.
  • 使用WebRTC服务器作为对等方之一的对等通信功能.

Adam Roach提供了第二种情况的可能解决方案,我还没有亲自测试过.

  1. 浏览器检索其中包含javascript的网页.
  2. 浏览器执行javascript,其中:
    1. 获取相机的句柄,使用getUserMedia,
    2. 创造一个 RTCPeerConnection
    3. 呼吁createOffersetLocalDescriptionRTCPeerConnection
    4. 向包含商品的服务器发送请求(SDP格式)
  3. 服务器处理商品SDP并生成自己的答案SDP,并在其响应中返回浏览器.
  4. 该JavaScript调用setRemoteDescriptionRTCPeerConnection 启动媒体流.
  5. 服务器开始DTLS/SRTP从浏览器接收数据包,然后根据需要执行任何操作,直到并包括以易读的格式存储在本地硬盘驱动器上.

资源

这将使用VP8Vorbis内部WebMSRTP(UDP也可以使用TCP).

除非您可以RTCPeerConnection直接ASP使用包装器实现,否则您需要一种方法将流转发到您的服务器应用程序.

PeerConnection API是一个强大的功能WebRTC.它目前由Web Hang使用的WebRTC版本使用.您可以阅读:环聊如何使用WebRTC.


Bor*_* B. 5

同意这是一个偏离主题的问题,但我最近碰到了相同的问题/要求,我的解决方案是使用来自WebRTCExperiments的MultiStreamRecorder.这基本上给你一个每X秒的音频/视频流的"斑点",并且证明你可以上传你的ASP.NET MVC或控制器的WebAPI 这里.您可以按部分对服务器上的blob进行实时处理,也可以将它们连接到文件,然后在流停止后进行处理.请注意,并非所有浏览器都完全支持此库中使用的API,例如,目前还没有iOS支持.

我的服务器端分析要求用户说出完整的句子,所以另外我使用PitchDetect.js在将部分blob发送到服务器之前检测音频流中的静音.使用这种类型的设置,您可以将客户端配置为在完成通话后将部分blob发送到服务器,而不是每隔X秒.

至于实现1-2秒延迟,我建议查看WebSockets以进行交付,而不是HTTP POST - 但您应该使用这些选项并根据您的要求选择最佳渠道.