modified lib-jitsi-meet dev repo
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

example.js 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /* global $, JitsiMeetJS */
  2. const options = {
  3. hosts: {
  4. domain: 'jitsi-meet.example.com',
  5. muc: 'conference.jitsi-meet.example.com' // FIXME: use XEP-0030
  6. },
  7. bosh: '//jitsi-meet.example.com/http-bind', // FIXME: use xep-0156 for that
  8. // The name of client node advertised in XEP-0115 'c' stanza
  9. clientNode: 'http://jitsi.org/jitsimeet'
  10. };
  11. const confOptions = {
  12. };
  13. let connection = null;
  14. let isJoined = false;
  15. let room = null;
  16. let localTracks = [];
  17. const remoteTracks = {};
  18. /**
  19. * Handles local tracks.
  20. * @param tracks Array with JitsiTrack objects
  21. */
  22. function onLocalTracks(tracks) {
  23. localTracks = tracks;
  24. for (let i = 0; i < localTracks.length; i++) {
  25. localTracks[i].addEventListener(
  26. JitsiMeetJS.events.track.TRACK_AUDIO_LEVEL_CHANGED,
  27. audioLevel => console.log(`Audio Level local: ${audioLevel}`));
  28. localTracks[i].addEventListener(
  29. JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
  30. () => console.log('local track muted'));
  31. localTracks[i].addEventListener(
  32. JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED,
  33. () => console.log('local track stoped'));
  34. localTracks[i].addEventListener(
  35. JitsiMeetJS.events.track.TRACK_AUDIO_OUTPUT_CHANGED,
  36. deviceId =>
  37. console.log(
  38. `track audio output device was changed to ${deviceId}`));
  39. if (localTracks[i].getType() === 'video') {
  40. $('body').append(`<video autoplay='1' id='localVideo${i}' />`);
  41. localTracks[i].attach($(`#localVideo${i}`)[0]);
  42. } else {
  43. $('body').append(
  44. `<audio autoplay='1' muted='true' id='localAudio${i}' />`);
  45. localTracks[i].attach($(`#localAudio${i}`)[0]);
  46. }
  47. if (isJoined) {
  48. room.addTrack(localTracks[i]);
  49. }
  50. }
  51. }
  52. /**
  53. * Handles remote tracks
  54. * @param track JitsiTrack object
  55. */
  56. function onRemoteTrack(track) {
  57. if (track.isLocal()) {
  58. return;
  59. }
  60. const participant = track.getParticipantId();
  61. if (!remoteTracks[participant]) {
  62. remoteTracks[participant] = [];
  63. }
  64. const idx = remoteTracks[participant].push(track);
  65. track.addEventListener(
  66. JitsiMeetJS.events.track.TRACK_AUDIO_LEVEL_CHANGED,
  67. audioLevel => console.log(`Audio Level remote: ${audioLevel}`));
  68. track.addEventListener(
  69. JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
  70. () => console.log('remote track muted'));
  71. track.addEventListener(
  72. JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED,
  73. () => console.log('remote track stoped'));
  74. track.addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_OUTPUT_CHANGED,
  75. deviceId =>
  76. console.log(
  77. `track audio output device was changed to ${deviceId}`));
  78. const id = participant + track.getType() + idx;
  79. if (track.getType() === 'video') {
  80. $('body').append(
  81. `<video autoplay='1' id='${participant}video${idx}' />`);
  82. } else {
  83. $('body').append(
  84. `<audio autoplay='1' id='${participant}audio${idx}' />`);
  85. }
  86. track.attach($(`#${id}`)[0]);
  87. }
  88. /**
  89. * That function is executed when the conference is joined
  90. */
  91. function onConferenceJoined() {
  92. console.log('conference joined!');
  93. isJoined = true;
  94. for (let i = 0; i < localTracks.length; i++) {
  95. room.addTrack(localTracks[i]);
  96. }
  97. }
  98. /**
  99. *
  100. * @param id
  101. */
  102. function onUserLeft(id) {
  103. console.log('user left');
  104. if (!remoteTracks[id]) {
  105. return;
  106. }
  107. const tracks = remoteTracks[id];
  108. for (let i = 0; i < tracks.length; i++) {
  109. tracks[i].detach($(`#${id}${tracks[i].getType()}`));
  110. }
  111. }
  112. /**
  113. * That function is called when connection is established successfully
  114. */
  115. function onConnectionSuccess() {
  116. room = connection.initJitsiConference('conference', confOptions);
  117. room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack);
  118. room.on(JitsiMeetJS.events.conference.TRACK_REMOVED, track => {
  119. console.log(`track removed!!!${track}`);
  120. });
  121. room.on(
  122. JitsiMeetJS.events.conference.CONFERENCE_JOINED,
  123. onConferenceJoined);
  124. room.on(JitsiMeetJS.events.conference.USER_JOINED, id => {
  125. console.log('user join');
  126. remoteTracks[id] = [];
  127. });
  128. room.on(JitsiMeetJS.events.conference.USER_LEFT, onUserLeft);
  129. room.on(JitsiMeetJS.events.conference.TRACK_MUTE_CHANGED, track => {
  130. console.log(`${track.getType()} - ${track.isMuted()}`);
  131. });
  132. room.on(
  133. JitsiMeetJS.events.conference.DISPLAY_NAME_CHANGED,
  134. (userID, displayName) => console.log(`${userID} - ${displayName}`));
  135. room.on(
  136. JitsiMeetJS.events.conference.TRACK_AUDIO_LEVEL_CHANGED,
  137. (userID, audioLevel) => console.log(`${userID} - ${audioLevel}`));
  138. room.on(
  139. JitsiMeetJS.events.conference.PHONE_NUMBER_CHANGED,
  140. () => console.log(`${room.getPhoneNumber()} - ${room.getPhonePin()}`));
  141. room.join();
  142. }
  143. /**
  144. * This function is called when the connection fail.
  145. */
  146. function onConnectionFailed() {
  147. console.error('Connection Failed!');
  148. }
  149. /**
  150. * This function is called when the connection fail.
  151. */
  152. function onDeviceListChanged(devices) {
  153. console.info('current devices', devices);
  154. }
  155. /**
  156. * This function is called when we disconnect.
  157. */
  158. function disconnect() {
  159. console.log('disconnect!');
  160. connection.removeEventListener(
  161. JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED,
  162. onConnectionSuccess);
  163. connection.removeEventListener(
  164. JitsiMeetJS.events.connection.CONNECTION_FAILED,
  165. onConnectionFailed);
  166. connection.removeEventListener(
  167. JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED,
  168. disconnect);
  169. }
  170. /**
  171. *
  172. */
  173. function unload() {
  174. for (let i = 0; i < localTracks.length; i++) {
  175. localTracks[i].dispose();
  176. }
  177. room.leave();
  178. connection.disconnect();
  179. }
  180. let isVideo = true;
  181. /**
  182. *
  183. */
  184. function switchVideo() { // eslint-disable-line no-unused-vars
  185. isVideo = !isVideo;
  186. if (localTracks[1]) {
  187. localTracks[1].dispose();
  188. localTracks.pop();
  189. }
  190. JitsiMeetJS.createLocalTracks({
  191. devices: [ isVideo ? 'video' : 'desktop' ]
  192. })
  193. .then(tracks => {
  194. localTracks.push(tracks[0]);
  195. localTracks[1].addEventListener(
  196. JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
  197. () => console.log('local track muted'));
  198. localTracks[1].addEventListener(
  199. JitsiMeetJS.events.track.LOCAL_TRACK_STOPPED,
  200. () => console.log('local track stoped'));
  201. localTracks[1].attach($('#localVideo1')[0]);
  202. room.addTrack(localTracks[1]);
  203. })
  204. .catch(error => console.log(error));
  205. }
  206. /**
  207. *
  208. * @param selected
  209. */
  210. function changeAudioOutput(selected) { // eslint-disable-line no-unused-vars
  211. JitsiMeetJS.mediaDevices.setAudioOutputDevice(selected.value);
  212. }
  213. $(window).bind('beforeunload', unload);
  214. $(window).bind('unload', unload);
  215. // JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.ERROR);
  216. const initOptions = {
  217. disableAudioLevels: true
  218. };
  219. JitsiMeetJS.init(initOptions);
  220. connection = new JitsiMeetJS.JitsiConnection(null, null, options);
  221. connection.addEventListener(
  222. JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED,
  223. onConnectionSuccess);
  224. connection.addEventListener(
  225. JitsiMeetJS.events.connection.CONNECTION_FAILED,
  226. onConnectionFailed);
  227. connection.addEventListener(
  228. JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED,
  229. disconnect);
  230. JitsiMeetJS.mediaDevices.addEventListener(
  231. JitsiMeetJS.events.mediaDevices.DEVICE_LIST_CHANGED,
  232. onDeviceListChanged);
  233. connection.connect();
  234. JitsiMeetJS.createLocalTracks({ devices: [ 'audio', 'video' ] })
  235. .then(onLocalTracks)
  236. .catch(error => {
  237. throw error;
  238. });
  239. if (JitsiMeetJS.mediaDevices.isDeviceChangeAvailable('output')) {
  240. JitsiMeetJS.mediaDevices.enumerateDevices(devices => {
  241. const audioOutputDevices
  242. = devices.filter(d => d.kind === 'audiooutput');
  243. if (audioOutputDevices.length > 1) {
  244. $('#audioOutputSelect').html(
  245. audioOutputDevices
  246. .map(
  247. d =>
  248. `<option value="${d.deviceId}">${d.label}</option>`)
  249. .join('\n'));
  250. $('#audioOutputSelectWrapper').show();
  251. }
  252. });
  253. }