我正在开发基于Ionic / AngularJS技术的webrtc调用/视频聊天应用程序。该应用程序与sip.js一起使用PBX服务器上的呼叫操作。对于IOS与WebRtc的集成,app可与cordova-plugin-iosrtc配合使用。当我尝试使用PBX连接来呼叫或接听电话时,应用程序会在sip.js上使用cordova-plugin-iosrtc两种可能的使用模式时抛出错误
A)当我尝试使用cordova-plugin-iosrtc工作在对等连接iOS插件模式....
telephoneService.js(Angular JS)
var pc = new cordova.plugins.iosrtc.RTCPeerConnection({
iceServers: []
});
cordova.plugins.iosrtc.getUserMedia(
// constraints
{ audio: true, video: true },
// success callback
function (stream) {
console.log('got local MediaStream: ', stream);
pc.addStream(stream);
},
// failure callback
function (error) {
console.error('getUserMedia failed: ', error);
}
);
var sessionDescriptionHandlerOptions = {
constraints: {
audio: audioId,
video: videoId
},
media: {
local: {
audio: document.getElementById('localAudio')
},
remote: {
audio: document.getElementById('remoteAudio')
}
},
extraHeaders: extraHeaders
}
}
userAgent.invite('sipusertocall', sessionDescriptionHandlerOptions);
收到下一个错误:
undefined is not a object evaluating 'environment.navigator.mediaDevices.getUserMedia' (sip.js lib)
B)
cordova.plugins.iosrtc.registerGlobals(); use iosrtc plugin with webrtc native api (navigator.mediaDevice.getUserMedia(), ....)
navigator.mediaDevices.getUserMedia(
function (stream) {
console.log('got local MediaStream: ', stream);
window.stream = stream;
},
// failure callback
function (error) {
console.error('getUserMedia failed: ', error);
}
)
var sessionDescriptionHandlerOptions = {
constraints: {
audio: audioId,
video: videoId
},
media: {
local: {
audio: document.getElementById('localAudio')
},
remote: {
audio: document.getElementById('remoteAudio')
}
},
extraHeaders: extraHeaders
}
userAgent.invite('sipusertocall', sessionDescriptionHandlerOptions);
App receive from sip.js next error from PBX: Failed:WebRTC Error
客户端同时显示下一个错误:
必须使用RTCSessionDescription实例作为第一个参数调用setLocalDescription()
所以较新的SIP.js实际上是在传递一个RTCSessionDescriptionInit的实例,虽然它有一个类似的结构:{sdp:...,类型:...}到一个RTCSessionDescription init不被cordova iosrtc实现接受。
我已经以SIP.js的自定义SDH的形式为此创建了一个修复程序(因为我遇到了完全相同的问题)。我的自定义SDH在将对象传递到getLocationDescription和setRemoteDescription之前将其转换为新的RTCSessionDescription(...)。
链接到SDH插件:https://github.com/iotum/cordova-ios-session-description-handler
希望这可以帮助!韦斯