web-dev-qa-db-de.com

Handhabung/Empfang eines Live-Video-Webcam-Streams von WebRTC oder einem anderen browserbasierten Erfassungsmechanismus auf dem Server mithilfe von ASP.NET MVC

Wir müssen einen Live-Videostream von WebRTC (oder einem anderen Erfassungsmechanismus von der Client-Webcam erfassen, auch wenn er nicht von allen Browsern unterstützt wird, sondern als PoC).

Dieses Live-Video muss von einer Serverkomponente (ASP.Net MVC/Web-API) verarbeitet werden. Ich kann mir vorstellen, dass der Code auf dem Server folgendermaßen aussieht:

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

Suchen Sie nach einem Stichwort oder einem hilfreichen Link. 

Wir haben bereits eine Möglichkeit zum Senden einzelner Frames mithilfe von base64-jpg implementiert. Dies ist jedoch überhaupt nicht hilfreich, da die base64-Kodierung mit einem enormen Aufwand verbunden ist und wir das Videobild mit einer beliebigen Videokodierung effizienter senden können Zwischen den Frames (z. B. mit VPx -vp8-) muss die erforderliche Lösung ein Video von der Webcam des Clients aufnehmen und dieses live (nicht aufgezeichnet) als Stream oder Datenblöcke an den Server (asp.net) senden Darstellung der neuen Videodaten.

18
Sawan

Ihre Frage ist zu umfassend und das Nachfragen nach Ressourcen außerhalb des Standorts wird für Stackoverflow als nicht relevant betrachtet. Um Meinungsverschiedenheiten zu vermeiden, werde ich die Antwort auf allgemeine Begriffe beschränken.

Flash/RTMP

WebRTC ist noch nicht in allen Browsern verfügbar. Die am häufigsten verwendete Methode zum Erfassen von Webcam-Eingaben eines aktuell verwendeten Browsers erfolgt über ein Plugin. Die gebräuchlichste Lösung verwendet den Adobe Flash Player , unabhängig davon, ob es den Leuten gefällt oder nicht. Dies liegt an der H.264-Kodierungsunterstützung in den letzten Versionen zusammen mit AAC, MP3 usw. für Audio. 

Das Streaming wird mithilfe des Protokolls RTMP durchgeführt, das ursprünglich für die Flash-Kommunikation konzipiert wurde. Das Protokoll arbeitet mit TCP und hat mehrere Varianten wie RTMPS (RTMP über TLS/SSL zur Verschlüsselung), RTMPT (RTMP in HTTP für Firewall-Traversal gekapselt). 

Der Stream verwendet normalerweise das FLV Containerformat.

Sie können problemlos Open-Source-Projekte finden, die mithilfe von Flash Webcam-Eingaben erfassen und auf einen RTMP-Server streamen.

Auf der Serverseite haben Sie zwei Möglichkeiten:

  • implementieren Sie einen einfachen RTMP-Server, um direkt mit der sendenden Bibliothek zu sprechen und den Stream zu lesen
  • verwenden Sie einen der Open-Source-Server (RTMP) und implementieren Sie nur einen Client in ASP (Sie können den eingehenden Stream auch spontan transcodieren, je nachdem, was Sie mit Ihrer App versuchen.).

WebRTC

Mit WebRTC können Sie entweder:

  • zeichnen Sie kleine Medienblöcke mit einem Timer auf und laden Sie sie auf den Server hoch, auf dem der Stream rekonstruiert wird (Erfordert das Verketten und Stempeln der Blöcke, um Diskontinuitäten zu vermeiden). Siehe diese Antwort für Links .
  • verwenden Sie die Peer-to-Peer-Kommunikationsfunktionen von WebRTC, wobei der Server einer der Peers ist.

Eine mögliche Lösung für das zweite Szenario, das ich noch nicht persönlich getestet habe, bietet Adam Roach:

  1. Der Browser ruft eine Webseite mit Javascript ab. 
  2. Browser führt Javascript aus, das:
    1. Ruft ein Handle für die Kamera mit getUserMedia ab. 
    2. Erzeugt eine RTCPeerConnection
    3. Ruft createOffer und setLocalDescription für die .__ auf. RTCPeerConnection 
    4. Sendet eine Anfrage an den Server, der das Angebot enthält (im SDP-Format) 
  3. Der Server verarbeitet das Angebot SDP und generiert eine eigene Antwort SDP, die er in seiner Antwort an den Browser zurückgibt. 
  4. Das JavaScript ruft setRemoteDescription für die RTCPeerConnection .__ auf. die Medien fließen zu lassen. 
  5. Der Server empfängt DTLS/SRTP-Pakete vom Browser was es dann macht, was es will, bis hin zum Speichern in einem leicht lesbaren Format auf einer lokalen Festplatte.

Quelle

Dies wird VP8 und Vorbis in WebM über SRTP verwenden (UDP, kann auch TCP verwenden).

Wenn Sie RTCPeerConnection nicht direkt in ASP mit einem Wrapper implementieren können, benötigen Sie eine Möglichkeit, den Stream an Ihre Server-App weiterzuleiten.

Der PeerConnection API ist eine leistungsstarke Funktion von WebRTC. Es wird derzeit von der WebRTC-Version von Google Hangouts verwendet. Sie können lesen: Wie verwendet Hangouts WebRTC .

12
aergistal

Ich stimmte zu, dass dies eine Off-Topic-Frage ist, aber vor kurzem stieß ich auf dieselbe Frage/Anforderung und meine Lösung bestand darin, MultiStreamRecorder von WebRTCExperiments zu verwenden. Im Grunde erhalten Sie alle X Sekunden einen "Blob" des Audio-/Video-Streams, und Sie können diesen auf Ihren ASP.NET MVC- oder WebAPI-Controller hochladen, wie gezeigt here . Sie können entweder die Blobs auf dem Server Teil für Teil live verarbeiten oder sie zu einer Datei verketten und dann verarbeiten, sobald der Stream gestoppt ist. Beachten Sie, dass die in dieser Bibliothek verwendeten APIs nicht in allen Browsern vollständig unterstützt werden. Beispielsweise gibt es noch keine iOS-Unterstützung.

Bei meiner serverseitigen Analyse musste der Benutzer vollständige Sätze sprechen. Daher verwendete ich PitchDetect.js, um Stille im Audiostream zu erkennen, bevor der partielle Blob an den Server gesendet wurde. Mit dieser Art von Setup können Sie Ihren Client so konfigurieren, dass er nach jedem Gespräch Teil-Blobs an den Server sendet, und nicht alle X Sekunden.

Um eine Verzögerung von 1 bis 2 Sekunden zu erreichen, würde ich empfehlen, WebSockets eher für die Zustellung als für HTTP POST zu suchen. Sie sollten jedoch mit diesen Optionen spielen und den besten Kanal für Ihre Anforderungen auswählen.

5
Bora B.

Die meisten IP-Kameras verwenden heutzutage die H264-Kodierung oder MJPEG. Sie wissen nicht genau, welche Kameras verwendet werden.

Ich denke, die eigentliche Frage ist, welche Komponenten für das Authoring/Editieren von Videos verfügbar sind und welches Videoformat dies erfordert. Erst wenn Sie wissen, in welchem ​​Format Sie sich befinden müssen, können Sie Ihr Video nach Bedarf transkodieren/transformieren, um es auf der Serverseite zu bearbeiten.

Es gibt eine beliebige Anzahl von Medienservern, die transformiert/umkodiert werden können, und etwas wie FFMPEG oder Unreal Media Server kann auf der Serverseite transformiert, decodiert usw. werden, um ein Format zu erhalten, mit dem Sie arbeiten können. Die meisten IP-Kameras, die ich gesehen habe, verwenden nur einen webbasierten H264-Browser.

EDIT: Dein größter Feind wird deine Verzögerung sein. Eine Verzögerung von 1-2 Sekunden wird schwer zu erreichen sein.

0
Calvinthesneak