UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

169 lines (168 loc) 5.22 kB
function SrsRtcPlayerAsync() { var self = {}; self.play = async function(url) { var conf = self.__internal.prepareUrl(url); self.pc.addTransceiver("audio", { direction: "recvonly" }); self.pc.addTransceiver("video", { direction: "recvonly" }); var offer = await self.pc.createOffer(); await self.pc.setLocalDescription(offer); var session = await new Promise(function(resolve, reject) { var data = { api: conf.apiUrl, tid: conf.tid, streamurl: conf.streamUrl, clientip: null, sdp: offer.sdp }; console.log("Generated offer: ", data); fetch(conf.apiUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }).then((response) => response.json()).then((data2) => { console.log("Got answer: ", data2); if (data2.code) { reject(data2); return; } resolve(data2); }).catch((error) => { reject(error); }); }); await self.pc.setRemoteDescription( new RTCSessionDescription({ type: "answer", sdp: session.sdp }) ); session.simulator = conf.schema + "//" + conf.urlObject.server + ":" + conf.port + "/rtc/v1/nack/"; return session; }; self.close = function() { self.pc && self.pc.close(); self.pc = null; }; self.ontrack = function(event) { self.stream.addTrack(event.track); }; self.__internal = { defaultPath: "/rtc/v1/play/", prepareUrl: function(webrtcUrl) { var urlObject = self.__internal.parse(webrtcUrl); var schema = urlObject.user_query.schema; schema = schema ? schema + ":" : window.location.protocol; var port = urlObject.port || 1985; if (schema === "https:") { port = urlObject.port || 443; } var api = urlObject.user_query.play || self.__internal.defaultPath; if (api.lastIndexOf("/") !== api.length - 1) { api += "/"; } apiUrl = schema + "//" + urlObject.server + ":" + port + api; for (var key in urlObject.user_query) { if (key !== "api" && key !== "play") { apiUrl += "&" + key + "=" + urlObject.user_query[key]; } } var apiUrl = apiUrl.replace(api + "&", api + "?"); var streamUrl = urlObject.url; return { apiUrl, streamUrl, schema, urlObject, port, tid: Number(parseInt(new Date().getTime() * Math.random() * 100)).toString(16).substr(0, 7) }; }, parse: function(url) { var a = document.createElement("a"); a.href = url.replace("rtmp://", "http://").replace("webrtc://", "http://").replace("rtc://", "http://"); var vhost = a.hostname; var app = a.pathname.substr(1, a.pathname.lastIndexOf("/") - 1); var stream = a.pathname.substr(a.pathname.lastIndexOf("/") + 1); app = app.replace("...vhost...", "?vhost="); if (app.indexOf("?") >= 0) { var params = app.substr(app.indexOf("?")); app = app.substr(0, app.indexOf("?")); if (params.indexOf("vhost=") > 0) { vhost = params.substr(params.indexOf("vhost=") + "vhost=".length); if (vhost.indexOf("&") > 0) { vhost = vhost.substr(0, vhost.indexOf("&")); } } } if (a.hostname === vhost) { var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; if (re.test(a.hostname)) { vhost = "__defaultVhost__"; } } var schema = "rtmp"; if (url.indexOf("://") > 0) { schema = url.substr(0, url.indexOf("://")); } var port = a.port; if (!port) { if (schema === "http") { port = 80; } else if (schema === "https") { port = 443; } else if (schema === "rtmp") { port = 1935; } } var ret = { url, schema, server: a.hostname, port, vhost, app, stream }; self.__internal.fill_query(a.search, ret); if (!ret.port) { if (schema === "webrtc" || schema === "rtc") { if (ret.user_query.schema === "https") { ret.port = 443; } else if (window.location.href.indexOf("https://") === 0) { ret.port = 443; } else { ret.port = 1985; } } } return ret; }, fill_query: function(query_string, obj) { obj.user_query = {}; if (query_string.length === 0) { return; } if (query_string.indexOf("?") >= 0) { query_string = query_string.split("?")[1]; } var queries = query_string.split("&"); for (var i = 0; i < queries.length; i++) { var elem = queries[i]; var query = elem.split("="); obj[query[0]] = query[1]; obj.user_query[query[0]] = query[1]; } if (obj.domain) { obj.vhost = obj.domain; } } }; self.pc = new RTCPeerConnection(null); self.stream = new MediaStream(); self.pc.ontrack = function(event) { if (self.ontrack) { self.ontrack(event); } }; return self; } export { SrsRtcPlayerAsync };