stuff
This commit is contained in:
parent
ffc3940173
commit
b503175752
70
index.html
70
index.html
|
@ -8,14 +8,18 @@
|
|||
<script src="libs/strophe/strophe.disco.min.js?v=1"></script>
|
||||
<link rel="stylesheet" href="libs/bootstrap.min.css">
|
||||
<script src="libs/lib-jitsi-meet.min.js"></script>
|
||||
<script src="example.js" ></script>
|
||||
<script src="script.js" ></script>
|
||||
<style type="text/css">
|
||||
body {
|
||||
padding: 12px;
|
||||
padding: 6px;
|
||||
}
|
||||
video {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
border: 1px solid black;
|
||||
}
|
||||
.container-fluid {
|
||||
padding: 0;
|
||||
}
|
||||
.col-md-4 {
|
||||
padding: 0 !important;
|
||||
|
@ -26,56 +30,90 @@
|
|||
margin: 0 !important;
|
||||
}
|
||||
.video {
|
||||
height: 384px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="roomselector">
|
||||
<input type="text" id="roomname" />
|
||||
<button onclick="connect()" disabled id="roomnamebutton">Connect</button>
|
||||
</div>
|
||||
<div style="display: none" id="room">
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-md-4 video video-0">
|
||||
<video autoplay='autoplay' width="640" height="360"></video>
|
||||
<video autoplay='autoplay'></video>
|
||||
<audio autoplay='autoplay'></audio>
|
||||
<span></span>
|
||||
<input type="text" onchange="setName(0, this.value)">
|
||||
</div>
|
||||
<div class="col-md-4 video video-1">
|
||||
<video autoplay='autoplay' width="640" height="360"></video>
|
||||
<video autoplay='autoplay'></video>
|
||||
<audio autoplay='autoplay'></audio>
|
||||
<input type="text" onchange="setName(1, this.value)">
|
||||
<span></span>
|
||||
</div>
|
||||
<div class="col-md-4 video video-2">
|
||||
<video autoplay='autoplay' width="640" height="360"></video>
|
||||
<video autoplay='autoplay'></video>
|
||||
<audio autoplay='autoplay'></audio>
|
||||
<input type="text" onchange="setName(2, this.value)">
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-4 video video-3">
|
||||
<video autoplay='autoplay' width="640" height="360"></video>
|
||||
<video autoplay='autoplay'></video>
|
||||
<audio autoplay='autoplay'></audio>
|
||||
<input type="text" onchange="setName(3, this.value)">
|
||||
<span></span>
|
||||
</div>
|
||||
<div class="col-md-4 video video-4">
|
||||
<video autoplay='autoplay' width="640" height="360"></video>
|
||||
<video autoplay='autoplay'></video>
|
||||
<audio autoplay='autoplay'></audio>
|
||||
<input type="text" onchange="setName(4, this.value)">
|
||||
<span></span>
|
||||
</div>
|
||||
<div class="col-md-4 video video-5">
|
||||
<video autoplay='autoplay' width="640" height="360"></video>
|
||||
<video autoplay='autoplay'></video>
|
||||
<audio autoplay='autoplay'></audio>
|
||||
<input type="text" onchange="setName(5, this.value)">
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="volume-slider">
|
||||
<span class="volume">70%</span>
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" oninput="setLevel(0, this.value)">
|
||||
<span class="name"></span>
|
||||
</div>
|
||||
<div class="volume-slider">
|
||||
<span class="volume">70%</span>
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" oninput="setLevel(1, this.value)">
|
||||
<span class="name"></span>
|
||||
</div>
|
||||
<div class="volume-slider">
|
||||
<span class="volume">70%</span>
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" oninput="setLevel(2, this.value)">
|
||||
<span class="name"></span>
|
||||
</div>
|
||||
<div class="volume-slider">
|
||||
<span class="volume">70%</span>
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" oninput="setLevel(3, this.value)">
|
||||
<span class="name"></span>
|
||||
</div>
|
||||
<div class="volume-slider">
|
||||
<span class="volume">70%</span>
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" oninput="setLevel(4, this.value)">
|
||||
<span class="name"></span>
|
||||
</div>
|
||||
<div class="volume-slider">
|
||||
<span class="volume">70%</span>
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" oninput="setLevel(5, this.value)">
|
||||
<span class="name"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" onchange="setLevel(0, this.value)">
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" onchange="setLevel(1, this.value)">
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" onchange="setLevel(2, this.value)">
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" onchange="setLevel(3, this.value)">
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" onchange="setLevel(4, this.value)">
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" onchange="setLevel(5, this.value)">
|
||||
<div id="audioOutputSelectWrapper" style="display: none;">
|
||||
Change audio output device
|
||||
<select id="audioOutputSelect" onchange="changeAudioOutput(this)"></select>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -11,10 +11,9 @@ const confOptions = {
|
|||
};
|
||||
|
||||
const videoSize = {
|
||||
width: 640,
|
||||
height: 360
|
||||
width: 624,
|
||||
height: 351
|
||||
};
|
||||
const roomName = 'tt-test2';
|
||||
|
||||
let connection = null;
|
||||
let isJoined = false;
|
||||
|
@ -29,28 +28,8 @@ let remoteMappingName = [
|
|||
let trackMapping = {};
|
||||
// alle verfügbaren tracks mit participant id -> {audio: track, video: track}
|
||||
let tracks = {};
|
||||
|
||||
/**
|
||||
* Hinzufügen der Lokalen Tracks zum Stream, wobei ich immernoch meine, das ist überflüssig.
|
||||
* @param tracks
|
||||
*/
|
||||
function onLocalTracks(tracks) {
|
||||
localTracks = tracks;
|
||||
for (let i = 0; i < localTracks.length; i++) {
|
||||
if (localTracks[i].getType() === 'video') {
|
||||
$('body').append(`<video autoplay='1' id='localVideo${i}' />`);
|
||||
localTracks[i].attach($(`#localVideo${i}`)[0]);
|
||||
} else {
|
||||
$('body').append(
|
||||
`<audio autoplay='1' muted='true' id='localAudio${i}' />`);
|
||||
localTracks[i].attach($(`#localAudio${i}`)[0]);
|
||||
}
|
||||
if (isJoined) {
|
||||
room.addTrack(localTracks[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// name -> id
|
||||
let nameMapping = {};
|
||||
/**
|
||||
*
|
||||
* @param participant
|
||||
|
@ -122,7 +101,7 @@ function onConferenceJoined() {
|
|||
*/
|
||||
function onUserJoin(id, user) {
|
||||
console.log(`user join - ${user.getDisplayName()}`);
|
||||
|
||||
nameMapping[user.getDisplayName()] = id;
|
||||
let position = remoteMappingName.indexOf(user.getDisplayName());
|
||||
if(position >= 0) {
|
||||
console.log("user found");
|
||||
|
@ -136,6 +115,8 @@ function onUserJoin(id, user) {
|
|||
* @param displayName
|
||||
*/
|
||||
function onNameChange(participant, displayName) {
|
||||
|
||||
nameMapping[displayName] = id;
|
||||
// detach this user from current position
|
||||
detachUser(participant);
|
||||
let position = remoteMappingName.indexOf(displayName);
|
||||
|
@ -147,15 +128,7 @@ function onNameChange(participant, displayName) {
|
|||
detachUser(i);
|
||||
}
|
||||
}
|
||||
trackMapping[participant] = position;
|
||||
if (tracks[participant].video) {
|
||||
let elemID = `.video-${position} video`;
|
||||
tracks[participant].video.attach($(elemID)[0]);
|
||||
}
|
||||
if(tracks[participant].audio) {
|
||||
let elemID = `.video-${position} audio`;
|
||||
tracks[participant].audio.attach($(elemID)[0]);
|
||||
}
|
||||
attachUser(participant, position)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -168,6 +141,12 @@ function onUserLeft(id) {
|
|||
console.log('user left');
|
||||
detachUser(id);
|
||||
delete tracks[id];
|
||||
for(let i in nameMapping) {
|
||||
if(nameMapping[i] === id) {
|
||||
delete nameMapping[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function detachUser(id) {
|
||||
|
@ -182,20 +161,26 @@ function detachUser(id) {
|
|||
delete trackMapping[id]
|
||||
}
|
||||
}
|
||||
function attachUser(id, position) {
|
||||
if (trackMapping[id] != null) {
|
||||
console.log("attaching user " + id);
|
||||
trackMapping[id] = position;
|
||||
if (tracks[id].video) {
|
||||
let elemID = `.video-${position} video`;
|
||||
tracks[id].video.attach($(elemID)[0]);
|
||||
}
|
||||
if(tracks[id].audio) {
|
||||
let elemID = `.video-${position} audio`;
|
||||
tracks[id].audio.attach($(elemID)[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* That function is called when connection is established successfully
|
||||
*/
|
||||
function onConnectionSuccess() {
|
||||
room = connection.initJitsiConference(roomName, confOptions);
|
||||
room.setDisplayName("Streamer");
|
||||
room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack);
|
||||
room.on(JitsiMeetJS.events.conference.TRACK_REMOVED, onRemoteTrackRemove);
|
||||
room.on(JitsiMeetJS.events.conference.CONFERENCE_JOINED, onConferenceJoined);
|
||||
room.on(JitsiMeetJS.events.conference.USER_JOINED, onUserJoin);
|
||||
room.on(JitsiMeetJS.events.conference.USER_LEFT, onUserLeft);
|
||||
room.on(JitsiMeetJS.events.conference.DISPLAY_NAME_CHANGED, onNameChange);
|
||||
room.join();
|
||||
$('#roomnamebutton').prop('disabled', false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -208,8 +193,9 @@ function onVideoResize(event) {
|
|||
const aspectRatio = width/height;
|
||||
console.log(`${aspectRatio} is the aspect ratio`);
|
||||
|
||||
let targetWidth = 640;
|
||||
let targetHeight = 360;
|
||||
let targetWidth = videoSize.width;
|
||||
let targetHeight = videoSize.height
|
||||
;
|
||||
if(width > videoSize.width) {
|
||||
targetHeight *= videoSize.width / width
|
||||
}
|
||||
|
@ -233,8 +219,8 @@ $(document).ready(function() {
|
|||
if(!video.hasOwnProperty(i)) {
|
||||
continue;
|
||||
}
|
||||
$(video[i]).find('span').text(remoteMappingName[i]);
|
||||
$(video[i]).find('video').on('resize', onVideoResize);
|
||||
$(video[i]).find('input')[0].value = remoteMappingName[i];
|
||||
$(video[i]).find('video').on('resize', onVideoResize).width(videoSize.width).height(videoSize.height);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -251,6 +237,22 @@ function disconnect() {
|
|||
disconnect);
|
||||
}
|
||||
|
||||
function connect() {
|
||||
const roomName = $('#roomname').val();
|
||||
|
||||
room = connection.initJitsiConference(roomName, confOptions);
|
||||
room.setDisplayName("Streamer");
|
||||
room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack);
|
||||
room.on(JitsiMeetJS.events.conference.TRACK_REMOVED, onRemoteTrackRemove);
|
||||
room.on(JitsiMeetJS.events.conference.CONFERENCE_JOINED, onConferenceJoined);
|
||||
room.on(JitsiMeetJS.events.conference.USER_JOINED, onUserJoin);
|
||||
room.on(JitsiMeetJS.events.conference.USER_LEFT, onUserLeft);
|
||||
room.on(JitsiMeetJS.events.conference.DISPLAY_NAME_CHANGED, onNameChange);
|
||||
room.join();
|
||||
$('#roomselector').hide();
|
||||
$('#room').show();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -261,9 +263,25 @@ function unload() {
|
|||
|
||||
|
||||
function setLevel(id, level) {
|
||||
let track = $(`#audio-${id}`)[0];
|
||||
console.log(`setting volume of ${id} to ${level*100}%`);
|
||||
let track = $(`.video-${id} audio`)[0];
|
||||
track.volume = level;
|
||||
}
|
||||
|
||||
function setName(position, name) {
|
||||
console.log(`setting name of ${position} to ${name}`);
|
||||
remoteMappingName[position] = name;
|
||||
for(let i in trackMapping) {
|
||||
if(trackMapping[i] === position) {
|
||||
detachUser(i)
|
||||
}
|
||||
}
|
||||
for(let i in nameMapping) {
|
||||
if(nameMapping[i] != null) {
|
||||
attachUser(nameMapping[i], position)
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param selected
|
||||
|
@ -291,13 +309,6 @@ connection.addEventListener(
|
|||
|
||||
connection.connect();
|
||||
|
||||
JitsiMeetJS.createLocalTracks({ devices: [ 'audio', 'video' ] })
|
||||
.then(onLocalTracks)
|
||||
.catch(error => {
|
||||
throw error;
|
||||
});
|
||||
|
||||
|
||||
if (JitsiMeetJS.mediaDevices.isDeviceChangeAvailable('output')) {
|
||||
JitsiMeetJS.mediaDevices.enumerateDevices(devices => {
|
||||
const audioOutputDevices
|
Loading…
Reference in New Issue