ΠΠΏΠΈΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ
ΠΠ΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
DOMException: Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ setRemoteDescription Π΄Π»Ρ RTCPeerConnection: Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· SessionDescription. [ΠΎΠ±ΡΠ΅ΠΊΡ Object] ΠΠΆΠΈΠ΄Π°Π΅ΠΌΠ°Ρ ΡΡΡΠΎΠΊΠ°: v =
ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http: //localhost/sip-0.11.4%20 (1) .js: 9733: 38
Π£ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ ΠΆΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΊΠΎΠ΄Π°:
`/ **
* Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π±Π°Π·ΠΎΠ²ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠ°
* @param {String} sessionDescription ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ΅ SIP-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠ°.
* @param {Object} [options] ΠΠ±ΡΠ΅ΠΊΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ getDescription
* @param {MediaStreamConstraints} [options.constraints] MediaStreamConstraints https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints
* @param {Object} [options.peerConnectionOptions] ΠΡΠ»ΠΈ ΡΡΠΎΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, ΠΎΠ½ Π²ΠΎΡΡΠΎΠ·Π΄Π°Π΅Ρ ΠΎΠ΄Π½ΠΎΡΠ°Π½Π³ΠΎΠ²ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Π½ΠΎΠ²ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ.
* @param {Array} [modifiers] ΠΠ°ΡΡΠΈΠ² Ρ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΌΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ
* @returns {Promise} ΠΠ±Π΅ΡΠ°Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π΄Π°Π½ΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ
* /
setDescription: {Writable: true, value: function setDescription (sessionDescription, options, modifiers) {
var _this = this;
var self = this;
options = options || {};
if (options.peerConnectionOptions) {
this.initPeerConnection(options.peerConnectionOptions);
}
modifiers = modifiers || [];
if (!Array.isArray(modifiers)) {
modifiers = [modifiers];
}
modifiers = modifiers.concat(this.modifiers);
var description = {
type: this.hasOffer('local') ? 'answer' : 'offer',
sdp: sessionDescription
};
return SIP.Utils.Promise.resolve().then(function () {
// Media should be acquired in getDescription unless we need to do it sooner for some reason (FF61+)
if (this.shouldAcquireMedia && this.options.alwaysAcquireMediaFirst) {
return this.acquire(this.constraints).then(function () {
this.shouldAcquireMedia = false;
}.bind(this));
}
}.bind(this)).then(function () {
return SIP.Utils.reducePromises(modifiers, description);
}).catch(function (e) {
if (e instanceof SIP.Exceptions.SessionDescriptionHandlerError) {
throw e;
}
var error = new SIP.Exceptions.SessionDescriptionHandlerError("setDescription", e, "The modifiers did not resolve successfully");
_this.logger.error(error.message);
self.emit('peerConnection-setRemoteDescriptionFailed', error);
throw error;
}).then(function (modifiedDescription) {
self.emit('setDescription', modifiedDescription);
return self.peerConnection.setRemoteDescription(modifiedDescription);
}).catch(function (e) {
if (e instanceof SIP.Exceptions.SessionDescriptionHandlerError) {
throw e;
}
// Check the original SDP for video, and ensure that we have want to do audio fallback
if (/^m=video.+$/gm.test(sessionDescription) && !options.disableAudioFallback) {
// Do not try to audio fallback again
options.disableAudioFallback = true;
// Remove video first, then do the other modifiers
return _this.setDescription(sessionDescription, options, [SIP.Web.Modifiers.stripVideo].concat(modifiers));
}
var error = new SIP.Exceptions.SessionDescriptionHandlerError("setDescription", e);
_this.logger.error(error.error);
_this.emit('peerConnection-setRemoteDescriptionFailed', error);
throw error;
}).then(function setRemoteDescriptionSuccess() {
if (self.peerConnection.getReceivers) {
self.emit('setRemoteDescription', self.peerConnection.getReceivers());
} else {
self.emit('setRemoteDescription', self.peerConnection.getRemoteStreams());
}
self.emit('confirmed', self);
});
} },`
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΊΠΎΠ΄Π° js ΠΏΠΎΠΊΠ°Π·Π°Π»Π° ΠΌΠ½Π΅, ΡΡΠΎ "modifiedDescription.sdp" ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠΈ Π΄Π»Ρ sdp.
ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΠΎΠ»Π½ΡΠ΅ Π»ΠΎΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»ΠΎΠ². ΠΡ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ SDP ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ ΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΡΡ Π²Π΅ΡΡΠΈΡ Π΄ΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΉ?
ΠΡΡΠ½Π°Π»Ρ ΠΈΠ· Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ°? Π Π½ΡΠΆΠ½ΠΎ traceSip: true, Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ Π±ΡΠ°ΡΠ·Π΅ΡΠ°?
ΠΠ°ΡΠΈΠ½Π°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ sip.js Ρ Π²Π΅ΡΡΠΈΠΈ 0.11.4. Π― Π½Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π» sdp.
ΠΠΎΠ½ΡΠΎΠ»Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ°
[gist] (https://gist.github.com/kakabara/d39058805af90637a62931893900fb55), Π½ΠΎ Π² firefox Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ Β«ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ SDP: ΠΎΡΠΈΠ±ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π° SDP Π² ΡΡΡΠΎΠΊΠ΅ 1: ΠΊΠΎΠ½Π΅Ρ ΡΡΡΠΎΠΊΠΈ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΊΠΎΠ½ΡΠ° Π±ΡΡΠ΅ΡΠ°Β». Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΡΠΎ Π½Π° 326 ΡΡΡΠΎΠΊΠ°Ρ
.
Π Google Chrome ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΌΠΎΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Ρ Π½Π΅ΡΠ΄Π°ΡΠ½ΡΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ setRemoteDescription
Asterisk Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Π½Π° ICE. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΡΡΠΈ Π½Π΅ ΡΠ°, ΡΡΠΎ Π²Ρ ΡΠΊΠ°Π·Π°Π»ΠΈ Π²ΡΡΠ΅.
ΠΠ·Π²ΠΈΠ½ΠΈΡΠ΅, ΠΈΠ·-Π·Π° ΠΌΠΎΠ΅ΠΉ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅. Π― ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ ΠΌΠΎΠΉ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ Π°Π±ΠΎΠ½Π΅Π½Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π»Π΅Π΄ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ°, Π½ΠΎ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠ° Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ?
ΠΠ·Π²ΠΈΠ½ΠΈΡΠ΅. Π― Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ. WebRTC ΡΡΠ΅Π±ΡΠ΅Ρ ICE ΠΈ DTLS. ΠΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Asterisk, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡ Π·Π°ΠΊΡΡΡΡ ΡΡΠΎ. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠ²ΡΠΆΠΈΡΠ΅ΡΡ Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Asterisk ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ°ΠΌ.