2012-12-19 2 views
1

나는 이걸 가지고 내 머리카락을 꺼내고있다. 한 달 정도 전에, 저는 SignalR의 선량한 사람들의 샘플 코드를 사용하여 proof-of-concept WebRTC 데모를 만들 수있었습니다. 데모는 here이고, 소스는 here이며, 예상되는대로 작동합니다.WebRTC 코드 문제 해결

하지만 코드를 가져 와서 실제 응용 프로그램으로 옮길 때까지 제대로 작동하지 못했습니다. 물론 코드가 크게 달라져야했습니다. 백엔드가 다르거 나 프레임 워크와 지원 코드가 다르며 여러 동시 연결을 지원해야합니다. 핵심 로직은 매우 유사합니다. 그러나 나는 그것을 작동시킬 수 없다.

나는 문제를 보여주는 샘플 응용 프로그램 여기에 함께 넣어했습니다

https://bitbucket.org/smithkl42/signalr.webrtc/src/tip/SignalR.WebRTC/Scripts/Media/WebRTC.ts?at=default

그것은 수백의 :

https://bitbucket.org/smithkl42/signalr.webrtc

핵심 WebRTC에 로직이 모든 타이프 스크립트 파일에 길기 때문에 여기에 게시하는 것이 어렵지는 않지만 위의 링크를 클릭하면 볼 수 있습니다.

12:17:58.531 WebRTCController.call(): Calling 7d9e0d39-5047-4afe-86e5-e6e01b9f5955 when preparations have finished

12:17:58.533 WebRTCController.prepareForCall(): Preparing for call: localSessionId='39d2df53-6854-415a-8748-b5230eda2eb1'; remoteSessionId='7d9e0d39-5047-4afe-86e5-e6e01b9f5955'

12:18:0.139 Object.(): The user has granted media device access, so proceeding to prepare for call

12:18:0.141 Connection.createPeerConnection(): Creating peer connection; using stunServer stun:stun1.l.google.com:19302

12:18:0.144(): Preparations finished. Creating and sending JSEP offer. Util.js:21

12:18:0.272 Connection.handleIceCandidate(): STUN server has found an ICE candidate (event.type='icecandidate').

12:18:0.282 Connection.handleIceCandidate(): STUN server has found an ICE candidate (event.type='icecandidate').

(More like that)

12:18:0.655 WebRTCController.handleJsepAnswer(): Handling JsepAnswer from 7d9e0d39-5047-4afe-86e5-e6e01b9f5955

12:18:0.694 Object.(): Sending ICE candidate to the remote machine: {"sdpMLineIndex":0,"sdpMid":"audio","candidate":"a=candidate:2999745851 1 udp 2113937151 192.168.56.1 62978 typ host generation 0\r\n"}

12:18:0.706 Object.(): Sending ICE candidate to the remote machine: {"sdpMLineIndex":0,"sdpMid":"audio","candidate":"a=candidate:2999745851 2 udp 2113937151 192.168.56.1 62978 typ host generation 0\r\n"}

(More like that)

을하지만 그것은 즉, 다른 측면에서 비디오가 결코 재생하지 시작, 연결하지 :이 실행되면

, 그것은 다음과 같은 출력을 생성합니다. 시그널링 레이어에서 로그를 통해 첫 번째 브라우저가 JSEP 오퍼를 보내는 코드를 단계별로 살펴볼 수 있습니다. 두 번째 브라우저가이를 수신하여이를 저장하고 적절한 JSEP 응답을 다시 전송합니다. 첫 번째 기계가 그 답을 저장하고 있습니다. 각 peerConnection은 ICE 후보를 찾아서 원격 시스템으로 보냅니다. 각 peerConnection이 해당 ICE 응시자를 수령하고 명백하게 시도하고 있습니다. peerConnections도 onaddstream 이벤트를 발생시킵니다. 그러나 비디오는 결코 재생되지 않습니다.

의 PeerConnection의 상태는 다음과 같습니다 통해 모든 방법을 객체 :

(iceGatheringState=new; iceState=starting; readyState=active)

실망 비트가 그 모든 너무 자주, 20 중 아마 한 번, 그것은 작업을 수행, 즉이다 두 동영상이 모두 표시됩니다. 그래서 나는 모든 것을하지 않고있다. 잘못되었다. 어떤 타이밍 문제처럼 들리지만, 그것이 무엇인지 알 수는 없습니다. 그리고 제가 말할 수있는 한, WebRTC 객체 (특히 RTCPeerConnection)에는 무엇이 잘못되었는지 알려주는 것이별로 없습니다.

나를 위해 문제 해결을 다른 사람에게 요청하는 것이 싫지만 ... 글쎄, 옵션이 부족합니다. 다른 사람들이 내가 분명히 잘못하고있는 것을 본 사람이 있습니까?

업데이트 2012-12-19 : 나는 약간의 진전을 이루고 있습니다. peerConnection.setLocalDescription()을 동기식으로, 즉 콜백을 지정하지 않고 호출하고 있다는 것을 깨달았습니다.

// Answer the call by sending a JsepAnswer message. 
connection.peerConnection.createAnswer(
    answer => { 
     connection.peerConnection.setLocalDescription(answer,() => { 
      var signalState: mData.SignalState = { 
       FromSessionId: connection.localSessionId, 
       ToSessionId: connection.remoteSessionId, 
       Message: JSON.stringify(answer) 
      }; 
      me.roomHub.server.jsepAnswer(signalState); 
      mUtil.log("Sent JSEP answer: " + signalState.Message); 
      connection.readyForIceCandidates.resolve(); 
     }, 
     error => { 
      mUtil.error("Error setting local description from created answer: " + error + "; answer=" + JSON.stringify(answer)); 
     }); 
    }, 
error => { 
    mUtil.error("Error creating answer: " + error); 
}, me.mediaConstraints); 

그리고 setLocalDescription() 오류 콜백이 오류가 표시되고 :

16:14:42.439 WebRTCController.handleJsepOffer(): Error setting local description from created answer: SetLocalDescription failed.; answer={"sdp":"v=0\r\no=- 439659381 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjf\r\nm=audio 1 RTP/SAVPF 103 104 111 0 8 107 106 105 13 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0.0.0\r\na=ice-ufrag:vOKflTJ56gV0R9i0\r\na=ice-pwd:9nuXPMDvQ2mZATFCQyEzPRQz\r\na=sendrecv\r\na=mid:audio\r\na=rtcp-mux\r\na=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:m9q9pmLgLuFnfFC09KXKW5p8TjsKk+VdqX0OWv77\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:111 opus/48000/2\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:107 CN/48000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:548068416 cname:IXg8QRisWrd7+7f8\r\na=ssrc:548068416 msid:u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjf a0\r\na=ssrc:548068416 mslabel:u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjf\r\na=ssrc:548068416 label:u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjfa0\r\nm=video 1 RTP/SAVPF 100 116 117\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0.0.0\r\na=ice-ufrag:vOKflTJ56gV0R9i0\r\na=ice-pwd:9nuXPMDvQ2mZATFCQyEzPRQz\r\na=sendrecv\r\na=mid:video\r\na=rtcp-mux\r\na=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:m9q9pmLgLuFnfFC09KXKW5p8TjsKk+VdqX0OWv77\r\na=rtpmap:100 VP8/90000\r\na=rtpmap:116 red/90000\r\na=rtpmap:117 ulpfec/90000\r\na=ssrc:1460425980 cname:IXg8QRisWrd7+7f8\r\na=ssrc:1460425980 msid:u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjf v0\r\na=ssrc:1460425980 mslabel:u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjf\r\na=ssrc:1460425980 label:u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjfv0\r\n","type":"answer"}

지금 난 그냥 왜 특정 SDP를 알아 내야을 그래서 지금은 다음과 같이 몇 줄의 코드를 가지고 - createAnswer() 메소드에서 바로 나온 - 실패합니다.

업데이트 2012-12-20 : 여기에서 문제의 온라인 데모를 작성했습니다 : http://srdemo.alanta.com/. 나는 또한 다음과 같이 오류가 잔뜩 볼 수있는 결과, 크롬 디버그 로깅을 설정 한 : 그들은 내 문제에 무슨 관계

[6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null.

확실하지 않음을,하지만 난에 계속있어 그것을 들여다보십시오.

* 편집 2012-12-20 : 문제를 줄이기 위해 관리했습니다. 보다 자세한 내용은 this question을 참조하십시오.

답변

4

알아 냈어. 신호음 1.0 RC1에는 문자열의 "+"를 공백으로 바꾸는 버그가 있습니다. 이 닮은 SDP의 행 그래서 :

a=ice-pwd:qZFVvgfnSso1b8UV1SUDd2+z

이로 변경지고 있었다 :

a=ice-pwd:qZFVvgfnSso1b8UV1SUDd2 z

하지만 모든 SDP는 중요한 라인에있는 "+"를했기 때문에 때로는 효과가 있습니다. 모든 것이 설명되었습니다.

버그는 SignalR에서 작업하는 좋은 사람들에게보고되었으며 (https://github.com/SignalR/SignalR/issues/1194 참조) 그동안 문제의 문자열을 중심으로 간단한 encodeURIComponent()decodeURIComponent()이 수정되었습니다.

+0

android.is에 대한 webrtc를 만들어야 Android에서 webrtc를 만들 수 있습니까? 가능하다면 webrtc.as에 관한 지식을 Google과 공유 할 수 있습니다. 안드로이드의 webrtc에 관한 Google의 제한된 링크가 있습니다. –

+0

@IOSDeveloper - 예, Android의 WebRTC는 적어도 SDK를 통해 직접적으로 사용할 수도 있고 간접적으로 사용할 수도 있습니다 Android 용 Google 크롬 베타 브라우저의 최신 버전을 통해 구글 주변 - 당신은 그것을 알아낼거야. –