Date: Thu, 28 Mar 2024 11:40:36 +0100 (CET) Message-ID: <2095401534.47079.1711622436345@docs.flashphoner.com> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_47078_1401449796.1711622436344" ------=_Part_47078_1401449796.1711622436344 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html
=D0=94=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9 =D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1= =8C =D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D1=82 =D0=BA=D0=BE=D0=B4 =D0= =B4=D0=BB=D1=8F =D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1= =8F =D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC=D0=B8 =D0=BC=D0= =B5=D0=B4=D0=B8=D0=B0 =D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=B0=D0=BC=D0=B8 =D0= =B8 =D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0= =B5=D0=B9 =D0=BA=D0=BE=D0=BC=D0=BD=D0=B0=D1=82=D1=8B, =D0=B2=D0=BA=D0=BB=D1= =8E=D1=87=D0=B0=D1=8F =D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5 =D0= =BD=D0=BE=D0=B2=D1=8B=D1=85 =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=B5=D0=BA, =D0= =BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D1=83 =D1=81=D1=83=D1=89=D0= =B5=D1=81=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B8=D1=85 =D0=B4=D0=BE=D1=80=D0= =BE=D0=B6=D0=B5=D0=BA =D0=B8 =D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0= =B2=D0=BA=D1=83 =D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1= =86=D0=B8=D0=B8 =D0=BA=D0=BE=D0=BC=D0=BD=D0=B0=D1=82=D1=8B =D0=BF=D0=B5=D1= =80=D0=B5=D0=B4 =D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=BE=D0= =B9 =D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F =D1=81 =D1= =81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BE=D0=BC.
createControls() code
=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F-=D0=BE=D0=B1=D0=B5=D1=80=D1= =82=D0=BA=D0=B0 =D0=B4=D0=BB=D1=8F =D0=B2=D1=8B=D0=B7=D0=BE=D0=B2=D0=B0 =D0= =B8=D0=B7 =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B9 =D0=BB=D0=BE=D0= =B3=D0=B8=D0=BA=D0=B8, =D0=BE=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B8=D0= =B2=D0=B0=D0=B5=D1=82 =D0=BE=D0=B1=D0=BB=D0=B0=D1=81=D1=82=D1=8C =D0=B2=D0= =B8=D0=B4=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8
const createControl= s =3D function(config) {=20
=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5 =D0=BE=D0=B1=D1=8A=D0= =B5=D0=BA=D1=82=D0=B0 controls, =D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0= =D1=89=D0=B5=D0=B3=D0=BE =D0=B2=D1=81=D0=B5 HTML =D1=8D=D0=BB=D0=B5=D0=BC= =D0=B5=D0=BD=D1=82=D1=8B =D0=B4=D0=BB=D1=8F =D0=BD=D0=B0=D1=81=D1=82=D1=80= =D0=BE=D0=B9=D0=BA=D0=B8. =D0=97=D0=B4=D0=B5=D1=81=D1=8C =D0=B6=D0=B5 =D0= =B8=D0=BD=D0=B8=D1=86=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B8=D1=80=D1=83=D1=8E= =D1=82=D1=81=D1=8F =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B =D0=B4=D0=BB= =D1=8F =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8 =D0=BF=D1=83= =D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8 =D0=B4=D0=BE=D1=80=D0=BE= =D0=B6=D0=B5=D0=BA.
const controls =3D = { entrance: { url: document.getElementById("url"), roomName: document.getElementById("roomName"), roomPin: document.getElementById("roomPin"), nickName: document.getElementById("nickName"), enter: document.getElementById("startButton") }, addVideoTrack: { source: document.getElementById("addVideoTrackSource"), width: document.getElementById("addVideoTrackWidth"), height: document.getElementById("addVideoTrackHeight"), codec: document.getElementById("addVideoTrackCodec") }, addAudioTrack: { source: document.getElementById("addAudioTrackSource"), channels: document.getElementById("addAudioTrackChannels") }, addVideoEncoding: { rid: document.getElementById("addVideoTrackEncodingRid"), active: document.getElementById("addVideoTrackEncodingActive"), maxBitrate: document.getElementById("addVideoTrackEncodingMaxBitrat= e"), resolutionScale: document.getElementById("addVideoTrackEncodingReso= lutionScale") }, tables: { video: $('#videoTracksTable').DataTable({ "sDom": 't', "columns": [ { "className": 'details-control', "orderable": false, "data": null, "defaultContent": '' }, {"data": "source"}, {"data": "width"}, {"data": "height"}, {"data": "codec"}, {"data": "action"} ] }), audio: $('#audioTracksTable').DataTable({ "sDom": 't', "columns": [ {"data": "source"}, {"data": "channels"}, {"data": "action"} ] }), encodings: $('#videoTrackEncodingsTable').DataTable({ "sDom": 't', "columns": [ {"data": "rid"}, {"data": "active"}, {"data": "maxBitrate"}, {"data": "resolutionScale"}, {"data": "action"} ] }) } }=20
=D0=97=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BF=D0= =BE=D0=BB=D0=B5=D0=B9 =D0=BC=D0=BE=D0=B4=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0= =B3=D0=BE =D0=BE=D0=BA=D0=BD=D0=B0 =D0=B2=D1=85=D0=BE=D0=B4=D0=B0 =D0=B2 = =D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D0=B8 = =D1=81 =D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B5=D0=B9 =D0=BA=D0=BE=D0=BD=D1=84= =D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B5=D0=B9
//apply room config controls.entrance.url.value =3D config.room.url; controls.entrance.roomName.value =3D config.room.name; controls.entrance.roomPin.value =3D config.room.pin; controls.entrance.nickName.value =3D config.room.nickName;=20
addAudioTrackRow() code
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BD=D0= =BE=D0=B2=D1=8B=D1=85 =D0=B0=D1=83=D0=B4=D0=B8=D0=BE=D0=B4=D0=BE=D1=80=D0= =BE=D0=B6=D0=B5=D0=BA =D0=B8 =D0=BE=D0=BF=D0=BE=D0=B2=D0=B5=D1=89=D0=B5=D0= =BD=D0=B8=D0=B5 =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE =D0= =BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F
const addAudioTrack= Row =3D function(track) { getMedia([track]).then(function(stream){ let button =3D '<button id=3D"' + stream.id + '-button" class=3D= "btn btn-primary">Delete</button>'; const row =3D controls.tables.audio.row.add({ source: track.source, channels: track.channels, action: button, stream: stream }).node(); controls.tables.audio.draw(); $('#' + stream.id + "-button").on('click', function(){ //terminate stream console.log("terminate stream " + stream.id); let track =3D stream.getAudioTracks()[0]; track.stop(); track.dispatchEvent(new Event("ended")); }); stream.getTracks()[0].onended =3D function() { controls.tables.audio.row(row).remove().draw(); } trackCallback({ stream: stream, encodings: track.encodings }); }); }=20
=D0=97=D0=B0=D0=BF=D1=80=D0=BE=D1=81 =D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1= =8C=D0=BD=D0=BE=D0=B3=D0=BE =D0=BC=D0=B5=D0=B4=D0=B8=D0=B0 =D1=87=D0=B5=D1= =80=D0=B5=D0=B7 WebRTC API
getMedia([track]).t= hen(function(stream){=20
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=B0=D1= =83=D0=B4=D0=B8=D0=BE =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B8 =D0=B2 =D1= =82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83 =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0= =B5=D0=BA
let button =3D '<= ;button id=3D"' + stream.id + '-button" class=3D"btn btn-primary">Delete= </button>'; const row =3D controls.tables.audio.row.add({ source: track.source, channels: track.channels, action: button, stream: stream }).node(); controls.tables.audio.draw();=20
=D0=9F=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B0 =D0=BD=D0=B0 =D1=81=D0= =BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B5 "click". =D0=9F=D0=BE =D0=BD=D0=B0=D0=B6= =D0=B0=D1=82=D0=B8=D1=8E =D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8 "Delete" =D0= =B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B0 =D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0= =B0=D0=B2=D0=BB=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F, =D0=B3=D0=B5=D0= =BD=D0=B5=D1=80=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F =D1=81=D0=BE=D0= =B1=D1=8B=D1=82=D0=B8=D0=B5 "ended"
$('#' + st= ream.id + "-button").on('click', function(){ //terminate stream console.log("terminate stream " + stream.id); let track =3D stream.getAudioTracks()[0]; track.stop(); track.dispatchEvent(new Event("ended")); });=20
=D0=9F=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B0 =D0=BD=D0=B0 =D1=81=D0= =BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B5 "ended" =D0=B8 =D0=BE=D1=87=D0=B8=D1=81= =D1=82=D0=BA=D0=B0 =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B =D0=BF=D1=80= =D0=B8 =D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B8 =D0=B4=D0=B0= =D0=BD=D0=BD=D0=BE=D0=B3=D0=BE =D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F= p>
stream.getTracks()[= 0].onended =3D function() { controls.tables.audio.row(row).remove().draw(); }=20
=D0=9E=D0=BF=D0=BE=D0=B2=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BE=D1= =81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE =D0=BC=D0=BE=D0=B4=D1=83=D0= =BB=D1=8F =D0=BE =D1=82=D0=BE=D0=BC, =D1=87=D1=82=D0=BE =D0=B4=D0=BE=D0=B1= =D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0 =D0=BD=D0=BE=D0=B2=D0=B0=D1=8F =D0=B4= =D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B0
trackCallback({ stream: stream, encodings: track.encodings });=20
addVideoTrackRow() code
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BD=D0= =BE=D0=B2=D1=8B=D1=85 =D0=B2=D0=B8=D0=B4=D0=B5=D0=BE =D0=B4=D0=BE=D1=80=D0= =BE=D0=B6=D0=B5=D0=BA =D0=B8 =D0=BE=D0=BF=D0=BE=D0=B2=D0=B5=D1=89=D0=B5=D0= =BD=D0=B8=D0=B5 =D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE =D0= =BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F, =D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B3=D0= =B8=D1=87=D0=BD=D0=BE =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8 addAudioTr= ackRow.
const addVideoTrack= Row =3D function(track) { getMedia([track]).then(function(stream){ let button =3D '<button id=3D"' + stream.id + '-button" class=3D= "btn btn-primary">Delete</button>'; const row =3D controls.tables.video.row.add({ source: track.source, width: track.width, height: track.height, codec: track.codec, action: button, stream: stream, encodings: track.encodings }).node(); controls.tables.video.draw(); $('#' + stream.id + "-button").on('click', function(){ //terminate stream console.log("terminate stream " + stream.id); let track =3D stream.getVideoTracks()[0]; track.stop(); track.dispatchEvent(new Event("ended")); }); stream.getTracks()[0].addEventListener("ended", function() { controls.tables.video.row(row).remove().draw(); }); trackCallback({ stream: stream, encodings: track.encodings }); }); }=20
format() code
=D0=92=D1=81=D0=BF=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D1=82=D0=B5=D0=BB=D1=8C= =D0=BD=D0=B0=D1=8F =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F =D1=84=D0=BE= =D1=80=D0=BC=D0=B0=D1=82=D0=B8=D1=80=D1=83=D0=B5=D1=82 =D0=BD=D0=B0=D1=81= =D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8 =D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE= =D0=B2=D0=B0=D0=BD=D0=B8=D1=8F =D0=B2=D0=B8=D0=B4=D0=B5=D0=BE =D0=B4=D0=BB= =D1=8F =D0=B8=D1=85 =D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD= =D0=B8=D1=8F =D0=B2 =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5
const format =3D fu= nction(d) { if (!d.encodings) { return; } let details =3D '<table cellpadding=3D"5" cellspacing=3D"0" border= =3D"0" style=3D"padding-left:50px;">'; d.encodings.forEach(function(encoding){ details +=3D '<tr>'; for (const [key, value] of Object.entries(encoding)) { details +=3D '<td>'+ key + '</td>'+ '<td>'+ value + '</td>'; } details +=3D '</tr>'; }); details +=3D'</table>'; return details; }=20
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BE=D0= =B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=B0 =D0=B4=D0=BB=D1= =8F =D1=82=D0=BE=D0=B3=D0=BE, =D1=87=D1=82=D0=BE=D0=B1=D1=8B =D0=BF=D0=BE= =D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D1=8C =D0=B8=D0=BB=D0=B8 =D1=81=D0=BF=D1=80= =D1=8F=D1=82=D0=B0=D1=82=D1=8C =D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5 =D0=B2= =D0=B8=D0=B4=D0=B5=D0=BE =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B8
// Add event listen= er for opening and closing details $('#videoTracksTableBody').on('click', 'td.details-control', function () { let tr =3D $(this).closest('tr'); let row =3D controls.tables.video.row(tr); if (row.child.isShown()) { // This row is already open - close it row.child.hide(); tr.removeClass('shown'); } else { // Open this row row.child(format(row.data())).show(); tr.addClass('shown'); } });=20
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=B2=D1= =81=D0=B5=D1=85 =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=BD=D1= =8B=D1=85 =D0=B0=D1=83=D0=B4=D0=B8=D0=BE =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0= =B5=D0=BA =D0=B2 =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83
config.media.audio.= tracks.forEach(function(track){ addAudioTrackRow(track); })=20
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=B2=D1= =81=D0=B5=D1=85 =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=BD=D1= =8B=D1=85 =D0=B2=D0=B8=D0=B4=D0=B5=D0=BE =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0= =B5=D0=BA =D0=B2 =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83
config.media.video.= tracks.forEach(function(track){ addVideoTrackRow(track); })=20
muteForm() code
=D0=92=D1=81=D0=BF=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D1=82=D0=B5=D0=BB=D1=8C= =D0=BD=D0=B0=D1=8F =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F, =D0=BE=D1=82= =D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=8E=D1=89=D0=B0=D1=8F =D0=B2=D1=81=D0=B5 = =D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D1=8B =D1=83=D0=BA=D0=B0=D0=B7= =D0=B0=D0=BD=D0=BD=D0=BE=D0=B9 =D1=84=D0=BE=D1=80=D0=BC=D1=8B
const muteForm =3D = function(form) { for (const [key, value] of Object.entries(form)) { value.disabled =3D true; } }=20
unmuteForm() code
=D0=92=D1=81=D0=BF=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D1=82=D0=B5=D0=BB=D1=8C= =D0=BD=D0=B0=D1=8F =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F, =D0=B2=D0=BA= =D0=BB=D1=8E=D1=87=D0=B0=D1=8E=D1=89=D0=B0=D1=8F =D0=B2=D1=81=D0=B5 =D1=8D= =D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D1=8B =D1=83=D0=BA=D0=B0=D0=B7=D0=B0= =D0=BD=D0=BD=D0=BE=D0=B9 =D1=84=D0=BE=D1=80=D0=BC=D1=8B
const unmuteForm = =3D function(form) { for (const [key, value] of Object.entries(form)) { value.disabled =3D false; } }=20
muteInput() code
=D0=92=D1=81=D0=BF=D0=BE=D0=BC=D0=BE=D0=B3=D0=B0=D1=82=D0=B5=D0=BB=D1=8C= =D0=BD=D0=B0=D1=8F =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F, =D0=BE=D1=82= =D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=8E=D1=89=D0=B0=D1=8F =D0=BF=D0=BE=D0=BB= =D1=8F =D0=B2=D0=B2=D0=BE=D0=B4=D0=B0 =D0=B2 =D0=BC=D0=BE=D0=B4=D0=B0=D0=BB= =D1=8C=D0=BD=D0=BE=D0=BC =D0=BE=D0=BA=D0=BD=D0=B5
const muteInput =3D= function() { muteForm(controls.entrance); }=20
roomConfig() code
=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F =D1=81=D0=BE=D0=B1=D0=B8=D1= =80=D0=B0=D0=B5=D1=82 =D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82 =D0=BA=D0=BE=D0= =BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8 =D0=BA=D0=BE=D0= =BC=D0=BD=D0=B0=D1=82=D1=8B
const roomConfig = =3D function() { return { url: controls.entrance.url.value, roomName: controls.entrance.roomName.value, pin: controls.entrance.roomPin.value, nickname: controls.entrance.nickName.value } }=20
getVideoStreams() code
=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F =D0=B2=D0=BE=D0=B7=D0=B2=D1= =80=D0=B0=D1=89=D0=B0=D0=B5=D1=82 =D0=B2=D1=81=D0=B5 =D0=BB=D0=BE=D0=BA=D0= =B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5 =D0=B2=D0=B8=D0=B4=D0=B5=D0=BE =D0=B4=D0= =BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B8
const getVideoStrea= ms =3D function() { let streams =3D []; controls.tables.video.rows().every(function(rowIdx, tableLoop, rowLoop)= { let data =3D this.data(); streams.push({ stream: data.stream, encodings: data.encodings }); }); return streams; }=20
getAudioStreams() code
=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F =D0=B2=D0=BE=D0=B7=D0=B2=D1= =80=D0=B0=D1=89=D0=B0=D0=B5=D1=82 =D0=B2=D1=81=D0=B5 =D0=BB=D0=BE=D0=BA=D0= =B0=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5 =D0=B0=D1=83=D0=B4=D0=B8=D0=BE =D0=B4=D0= =BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B8
const getAudioStrea= ms =3D function() { let streams =3D []; controls.tables.audio.rows().every(function(rowIdx, tableLoop, rowLoop)= { let data =3D this.data(); streams.push({ stream: data.stream, encodings: [] }); }); return streams; }=20
=D0=9F=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B0 =D0=BD=D0=B0 =D1=81=D0= =BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B5 "click" =D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0= =B8 =D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F =D0=B4=D0= =BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B8. =D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1= =8F =D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82 =D0=BD=D0=BE=D0= =B2=D1=83=D1=8E =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D1=83 =D0=B2 =D1=82=D0= =B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83
document.getElement= ById("addVideoTrack").addEventListener("click", function(e){ let encodings =3D []; controls.tables.encodings.rows().every(function() { let encoding =3D this.data(); encodings.push({ rid: encoding.rid, active: encoding.active, maxBitrate: encoding.maxBitrate, scaleResolutionDownBy: encoding.resolutionScale }) }); let track =3D { source: controls.addVideoTrack.source.value, width: controls.addVideoTrack.width.value, height: controls.addVideoTrack.height.value, codec: controls.addVideoTrack.codec.value, encodings: encodings } addVideoTrackRow(track); });=20
=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BF=D0=B0=D1=80=D0= =B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2 =D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0= =BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F =D0=B2=D0=B8=D0=B4=D0=B5=D0=BE =D0=B8=D0= =B7 =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B
$("#videoTrackEncod= ingsTable").on("click", ".remove", function(){ controls.tables.encodings.row($(this).parents('tr')).remove().draw(); });=20
=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5 =D0=BF=D0= =B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2 =D0=BA=D0=BE=D0=B4=D0= =B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F =D0=B2=D0=B8=D0=B4=D0=B5=D0= =BE =D0=B2 =D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83
document.getElement= ById("addVideoTrackEncoding").addEventListener("click", function(){ let button =3D '<button class=3D"btn btn-primary remove">Delete&l= t;/button>'; controls.tables.encodings.row.add({ rid: controls.addVideoEncoding.rid.value, active: controls.addVideoEncoding.active.value, maxBitrate: controls.addVideoEncoding.maxBitrate.value, resolutionScale: controls.addVideoEncoding.resolutionScale.value, action: button }).draw(); });=20
=D0=9F=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=BA=D0=B0 =D0=BD=D0=B0 =D1=81=D0= =BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B5 "click" =D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0= =B8 =D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F =D0=B4=D0= =BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B8. =D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1= =8F =D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D1=82 =D0=BD=D0=BE=D0= =B2=D1=83=D1=8E =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D1=83 =D0=B2 =D1=82=D0= =B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83
document.getElement= ById("addAudioTrack").addEventListener("click", function(e){ let encodings =3D []; let track =3D { source: controls.addAudioTrack.source.value, channels: controls.addAudioTrack.channels.value, encodings: encodings } addAudioTrackRow(track); });=20
=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F =D0=BF=D0=B5=D1=80=D0=B5=D0= =B4=D0=B0=D0=B5=D1=82 =D1=83=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=BD=D1=83=D1= =8E callback =D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E =D0=BD=D0=BE=D0=B2= =D1=8B=D0=BC =D0=B4=D0=BE=D1=80=D0=BE=D0=B6=D0=BA=D0=B0=D0=BC
const onTrack =3D f= unction(callback) { trackCallback =3D callback; }=20
=D0=AD=D0=BA=D1=81=D0=BF=D0=BE=D1=80=D1=82 =D1=84=D1=83=D0=BD=D0=BA=D1= =86=D0=B8=D0=B9 =D0=B4=D0=BB=D1=8F =D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0= =B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F =D0=B2 =D0=BE=D1=81=D0=BD=D0=BE=D0= =B2=D0=BD=D0=BE=D0=BC =D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5
return { muteInput: muteInput, roomConfig: roomConfig, getAudioStreams: getAudioStreams, getVideoStreams: getVideoStreams, onTrack: onTrack }=20
getMedia() code
=D0=97=D0=B0=D0=BF=D1=80=D0=BE=D1=81 =D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0= =B0 =D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85 =D0=BC=D0=B5=D0= =B4=D0=B8=D0=B0 =D0=BF=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2 =D0=BE=D1=82 Web= RTC API
const getMedia =3D = async function(tracks) { //convert to constraints let screen =3D false; const constraints=3D {}; tracks.forEach(function(track){ if (track.source =3D=3D=3D "mic") { //audio constraints.audio =3D {}; constraints.audio.stereo =3D track.channels !=3D=3D 1 } else if (track.source =3D=3D=3D "camera") { constraints.video =3D { width: track.width, height: track.height }; } else if (track.source =3D=3D=3D "screen") { constraints.video =3D { width: track.width, height: track.height }; screen =3D true; } }); //get access to a/v let stream; if (screen) { stream =3D await navigator.mediaDevices.getDisplayMedia(constraints= ); } else { stream =3D await navigator.mediaDevices.getUserMedia(constraints); } return stream; }=20