2012-12-20 3 views
6

Dies ist ein Follow-up zu another question Ich fragte, aber mit genaueren Informationen.Verwenden von SignalR als Service-Layer für WebRTC

Ich habe zwei grundsätzlich identische Webseiten, die WebRTC demonstrieren, eine mit XSockets als Backend-Signalisierungsschicht und eine mit SignalR als Backend-Signalisierungsschicht.

Die beiden Backends sind grundsätzlich identisch und unterscheiden sich nur an den Punkten, an denen sie (offensichtlich) verschiedene Möglichkeiten haben, Daten an den Client zu senden. In ähnlicher Weise ist der TypeScript/JavaScript-WebRTC-Code auf den beiden Clients vollständig identisch, da ich die Signalisierungsschicht abstrahiert habe.

Das Problem ist, dass die XSockets-Site konsistent funktioniert, während die SignalR-Site fehlschlägt (meist konsistent, wenn auch nicht vollständig). In der Regel schlägt es beim Aufruf von peerConnection.setLocalDescription() fehl, aber es kann auch im Hintergrund fehlschlagen; oder es kann (manchmal) sogar funktionieren.

Sie können die beiden unterschiedlichen Seiten in Betrieb sehen hier:

XSockets Website: http://xsockets.demo.alanta.com/

SignalR Website: http://signalr.demo.alanta.com/

Der Quellcode sowohl für ist bei https://bitbucket.org/smithkl42/xsockets.webrtc, mit der XSockets Version auf der xsockets Verzweigung und die SignalR-Version auf dem Zweig signalr.

Meine Frage ist also: Weiß jemand irgendeinen Grund, warum die Verwendung einer Signalschicht anstelle einer anderen für WebRTC einen Unterschied machen würde? Zum Beispiel sendet der eine oder andere Unicode-Zeichenfolgen anstelle von ANSI zurück? Oder habe ich das Problem falsch diagnostiziert, und der wirkliche Unterschied ist anderswo?

Antwort

2

Ich habe es herausgefunden. Es stellt sich heraus, dass SignalR 1.0 RC1 einen Fehler enthält, der ein "+" in einer Zeichenfolge in ein Leerzeichen ändert. So Linien in der SDP, die wie folgt aussah:

a=ice-pwd:qZFVvgfnSso1b8UV1SUDd2+z

sich einließen dies geändert:

a=ice-pwd:qZFVvgfnSso1b8UV1SUDd2 z

Aber weil nicht hatte jeder SDP ein "+" in der es auf eine kritische Linie manchmal würde es funktionieren. Alles erklärt.

Der Fehler wurde auf die gut Leute berichteten über SignalR arbeiten (siehe https://github.com/SignalR/SignalR/issues/1194), und in der Zwischenzeit ein einfache encodeURIComponent() und decodeURIComponent() um die Saiten in Frage es fixierte.

+0

Ken, Haben Sie SignalR nur zur Signalisierung oder zum Transport von Video-/Audiodaten verwendet? –

+0

@ElanHasson - Nur zur Signalisierung. WebRTC ist komplex und unvollständig implementiert (im Grunde nur Firefox und Chrome, mit einigen Interoperabilitätsproblemen), bleibt aber der bevorzugte Transport für Echtzeit-Video-/Audiodaten. Ich habe nicht versucht, WebSockets für die Bereitstellung von Audio/Video zu verwenden, aber von dem, was ich über das Design und die typischen Implementierungen weiß, denke ich, dass Sie einige echte Probleme haben werden. Und ich denke, dass Long-Polling, Server Side Events und andere ähnliche Ansätze kein Ansporn sind. –

+1

Ich stimme zu. Ich bin gerade erst zu Flex/Red5 gewechselt. Red5 kann Livestreams, die das HTML5-Videoelement konsumieren kann, mit einem Flashback-Viewer umcodieren. Ich starb ein wenig im Inneren während der Entwicklung dieser Lösung. –