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

Handling / receiving live video webcam stream from WebRTC or any browser based capturing mechanism to the server using ASP.NET MVC

我们需要从 WebRTC(或来自客户端网络摄像头的任何其他捕获机制,即使并非所有浏览器都支持,但作为 PoC)捕获实时视频流。

这个直播视频需要由服务器组件处理(ASP.Net MVC / Web API),我想服务器上的代码会是这样的:

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

正在寻找任何关键字或有帮助的link。

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

您的问题过于宽泛,在 Whosebug 上要求站外资源被认为是题外话。为了避免倾向于发表意见的陈述,我将把答案限制在一般概念上。

Flash/RTMP

WebRTC 尚未在所有浏览器上可用,因此从当前使用的浏览器捕获网络摄像头输入的最广泛使用的方法是通过插件。最常见的解决方案使用 Adobe Flash Player,不管人们喜欢与否。这是由于最近版本中的 H.264 编码支持,以及音频的 AACMP3 等。

流式传输是使用 RTMP 协议完成的,该协议最初是为 Flash 通信设计的。该协议适用于 TCP 并具有多种风格,例如 RTMPSRTMP over TLS/SSL 用于加密),RTMPTRTMP 封装在 HTTP 用于防火墙穿越)。

流通常使用 FLV 容器格式。

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

在服务器端你有两个选择:

  • 实现一个基本的 RTMP 服务器直接与发送库对话并读取流
  • 使用其中一个开源 RTMP 服务器并在 ASP 中仅实现一个客户端(您还可以根据您要执行的操作动态对传入流进行转码你的应用程序)。

WebRTC

使用 WebRTC 您可以:

  • 在计时器上记录小的媒体块并将它们上传到重建流的服务器上(需要连接和重新标记块以避免不连续)。 See this answer for links.
  • 使用 WebRTC 的点对点通信功能,服务器是对等点之一。

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

  1. Browser retrieves a webpage with javascript in it.
  2. Browser executes javascript, which:
    1. Gets a handle to the camera using getUserMedia,
    2. Creates an RTCPeerConnection
    3. Calls createOffer and setLocalDescription on the RTCPeerConnection
    4. Sends an request to the server containing the offer (in SDP format)
  3. The server processes the offer SDP and generates its own answer SDP, which it returns to the browser in its response.
  4. The JavaScript calls setRemoteDescription on the RTCPeerConnection to start the media flowing.
  5. The server starts receiving DTLS/SRTP packets from the browser, which it then does whatever it wants to, up to and including storing in an easily readable format on a local hard drive.

Source

这将在 WebM 中使用 VP8Vorbis 而不是 SRTPUDP,也可以使用 TCP)。

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

PeerConnection APIWebRTC 的强大功能。 Google 环聊的 WebRTC 版本目前使用它。您可以阅读:How does Hangouts use WebRTC.

如今大多数 IP 摄像机都使用 H264 编码或 MJPEG。你不清楚用的是什么相机。

我认为真正的问题是,authoring/editing 视频有哪些组件,它需要哪种视频格式。只有当您知道您需要采用哪种格式后,您才能根据需要 transcode/transform 您的视频,以便您可以在服务器端处理它。

transform/transcode 有任意数量的媒体服务器,FFMPEG or Unreal Media Server 之类的东西可以在服务器端进行转换、解码等,以将其转换为您可以使用的某种格式。我见过的大多数 IP 摄像机都只使用基于 H264 网络的浏览器播放器。

编辑:你最大的敌人将是你的延迟。 1-2秒的延迟很难做到。

同意这是一个题外话的问题,但我最近遇到了同样的问题 issue/requirement,我的解决方案是使用 MultiStreamRecorder from WebRTCExperiments. This basically gives you a "blob" of the audio/video stream every X seconds, and you can upload this to your ASP.NET MVC or WebAPI controller as demonstrated here。您可以在服务器上逐个实时处理 blob,或者将它们连接到一个文件中,然后在流停止后进行处理。请注意,并非所有浏览器都完全支持此库中使用的 API,例如,目前还没有 iOS 支持。

我的服务器端分析要求用户说出完整的句子,因此我还使用 PitchDetect.js 在将部分 blob 发送到服务器之前检测音频流中的静音。使用这种类型的设置,您可以将客户端配置为在他们结束对话后向服务器发送部分 blob,而不是每隔 X 秒发送一次。

至于实现 1-2 秒的延迟,我建议研究 WebSockets 的传递方式,而不是 HTTP POST - 但您应该使用这些选项并根据您的要求选择最佳渠道。