Ich versuche, sip.js in meinem vue.js-Repository zu implementieren.
`
import sipModal from './sipModal.vue'
export default {
template: '#sipDialler',
name: 'sip-dialler',
data () {
return {
session: '',
ua: '',
hangupType: 'NOCALL',
inputNumber: '',
onCall: false,
callIncoming: false,
audioConstraints: {
audio: true,
video: false
},
mediaStream: ''
}
},
computed: {
media () {
const audio = document.getElementById('remoteAudio')
const audio2 = document.getElementById('localAudio')
return {
stream: this.audioConstraints,
render: {
remote: audio,
local: audio2
}
}
}
},
components: {
'sip-modal': sipModal
},
created () {
this.registerUserAgent()
},
methods: {
registerUserAgent () {
// eslint-disable-next-line
this.ua = new SIP.UA({
uri: '******.callwise.net',
wsServers: 'wss://sip.callwise.net:443',
traceSip: true,
authorizationUser: '******',
password: '********'
})
this.onRegistered()
this.onUnregistered()
this.onInvite()
},
onRegistered () {
this.ua.on('registered', function () {
// eslint-disable-next-line
SIP.WebRTC.isSupported()
// eslint-disable-next-line
SIP.WebRTC.getUserMedia(this.audioConstraints, function (stream) {
console.log(stream)
this.mediaStream = stream
}, function (e) {
console.error(e)
})
})
},
onUnregistered () {
this.ua.on('unregistered', function () {
console.log('unregistered')
})
},
onInvite () {
this.ua.on('invite', function (incoming) {
console.log('receiving call')
this.session = incoming
this.callIncoming = true
})
},
onFailed () {
this.session.on('failed', function (response, cause) {
this.callIncoming = false
})
},
makeCall () {
this.session = this.ua.invite('sip:' + this.inputNumber + '********.callwise.net', this.media)
},
answerCall () {
this.session.accept(this.media)
this.callIncoming = false
},
rejectCall () {
this.session.reject({statusCode: '486', reasonPhrase: 'Busy Here'})
},
deleteInput () {
this.inputNumber = this.inputNumber.slice(0, -1)
},
addHash () {
this.inputNumber += '#'
},
addAsterisk () {
this.inputNumber += '*'
}
}
}
`
When using that code I get ---> TypeError: Failed to execute 'getUserMedia' on 'Navigator': At least one of audio and video must be requested
at sip-0.7.5.js:10447
at Promise (
at Object.promisifiedMethod [as getUserMedia] (sip-0.7.5.js:10442)
at UA.eval (eval at 186 (0.9df3722….hot-update.js:7),
at UA.EventEmitter.emit (sip-0.7.5.js:112)
at RegisterContext.EventEmitter.emit (sip-0.7.5.js:112)
at RegisterContext.receiveResponse (sip-0.7.5.js:3477)
at RequestSender.receiveResponse (sip-0.7.5.js:3758)
at NonInviteClientTransaction.receiveResponse (sip-0.7.5.js:7615)
at Transport.onMessage (sip-0.7.5.js:8526)
(anonymous) @ sipDialler.vue?36c1:114
If I remove the bit:
SIP.WebRTC.getUserMedia(this.audioConstraints, function (stream) {
console.log(stream)
this.mediaStream = stream
}, function (e) {
console.error(e)
})
})
I don't get any errors and I'm able to make calls, the person I'm calling to can hear me on the mobile-phone but I'm not ables to hear the person I'm calling on my speakers.
Any ideas why is that happening?
Sie sollten getUserMedia
selbst anrufen müssen. Der Standardmedien-Handler erledigt dies für Sie.
Hallo Eric, danke für deine Antwort. Wie ich bei meinem ersten Problem sagte, wenn ich die Codezeile entferne:
SIP.WebRTC.getUserMedia(this.audioConstraints, function (stream) { console.log(stream) this.mediaStream = stream }, function (e) { console.error(e) }) })
Der Fehler wird nicht mehr angezeigt und ich kann von meiner Website aus Anrufe tätigen. Die Person, die ich anrufe, kann mich jedoch über ihr Mobiltelefon hören, aber ich kann die Person, die ich anrufe, nicht über die Lautsprecher meines Computers hören. Das heißt, die App greift auf mein Mikrofon zu, aber nicht auf meine Lautsprecher. Irgendeine Idee, warum es passiert?
Vielen Dank.
Können Sie zunächst bestätigen, dass das Remote-Audio mit dem Audioelement auf dem DOM verbunden ist? Bestätigen Sie auch, dass es abgespielt und nicht angehalten wird.
Wenn das der Fall ist, würde ich SIP.js zuerst außerhalb von vue.js zum Laufen bringen. Dann integrieren Sie es in vue. Es gibt wirklich nichts in vue, was SIP.js afaik beeinflussen sollte.
Danke Eric, endlich habe ich es geschafft, dass ich meine berechnete Methode von geändert habe
berechnet: {
media () {
const audio = document.getElementById('remoteAudio')
const audio2 = document.getElementById('localAudio')
return {
stream: this.audioConstraints,
render: {
remote: audio,
local: audio2
}
}
}
},
Zu:
options () {
const audio = document.getElementById('remoteAudio')
const audio2 = document.getElementById('localAudio')
return {
media: {
constraints: {
audio: true,
video: false
},
render: {
remote: audio,
local: audio2
}
}
}
},
Und das Aufrufen von this.options anstelle von this.media und scheint zu funktionieren.
Vielen Dank für die Hilfe, ich schließe das Thema.
@Juli0GT
Hi,
Könnten Sie bitte den Rest des Beispiels Ihres Arbeitscodes teilen?
Ich kämpfe auch damit, dass es funktioniert und du könntest mir sehr helfen.
Dankeschön
Hilfreichster Kommentar
@Juli0GT
Hi,
Könnten Sie bitte den Rest des Beispiels Ihres Arbeitscodes teilen?
Ich kämpfe auch damit, dass es funktioniert und du könntest mir sehr helfen.
Dankeschön