You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

example.js 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. var options = {
  2. hosts: {
  3. domain: 'hristo.jitsi.net',
  4. muc: 'conference.hristo.jitsi.net', // FIXME: use XEP-0030
  5. bridge: 'jitsi-videobridge.hristo.jitsi.net', // FIXME: use XEP-0030
  6. },
  7. bosh: '//hristo.jitsi.net/http-bind', // FIXME: use xep-0156 for that
  8. clientNode: 'http://jitsi.org/jitsimeet', // The name of client node advertised in XEP-0115 'c' stanza
  9. }
  10. var confOptions = {
  11. openSctp: true
  12. }
  13. var isJoined = false;
  14. /**
  15. * Handles local tracks.
  16. * @param tracks Array with JitsiTrack objects
  17. */
  18. function onLocalTracks(tracks)
  19. {
  20. localTracks = tracks;
  21. for(var i = 0; i < localTracks.length; i++)
  22. {
  23. localTracks[i].addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_LEVEL_CHANGED,
  24. function (audioLevel) {
  25. console.log("Audio Level local: " + audioLevel);
  26. });
  27. localTracks[i].addEventListener(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
  28. function () {
  29. console.log("local track muted");
  30. });
  31. localTracks[i].addEventListener(JitsiMeetJS.events.track.TRACK_STOPPED,
  32. function () {
  33. console.log("local track stoped");
  34. });
  35. if(localTracks[i].getType() == "video") {
  36. $("body").append("<video autoplay='1' id='localVideo" + i + "' />");
  37. localTracks[i].attach($("#localVideo" + i ));
  38. } else {
  39. $("body").append("<audio autoplay='1' id='localAudio" + i + "' />");
  40. localTracks[i].attach($("#localAudio" + i ));
  41. }
  42. if(isJoined)
  43. room.addTrack(localTracks[i]);
  44. }
  45. }
  46. /**
  47. * Handles remote tracks
  48. * @param track JitsiTrack object
  49. */
  50. function onRemoteTrack(track) {
  51. if(track.isLocal())
  52. return;
  53. var participant = track.getParticipantId();
  54. if(!remoteTracks[participant])
  55. remoteTracks[participant] = [];
  56. var idx = remoteTracks[participant].push(track);
  57. track.addEventListener(JitsiMeetJS.events.track.TRACK_AUDIO_LEVEL_CHANGED,
  58. function (audioLevel) {
  59. console.log("Audio Level remote: " + audioLevel);
  60. });
  61. track.addEventListener(JitsiMeetJS.events.track.TRACK_MUTE_CHANGED,
  62. function () {
  63. console.log("remote track muted");
  64. });
  65. track.addEventListener(JitsiMeetJS.events.track.TRACK_STOPPED,
  66. function () {
  67. console.log("remote track stoped");
  68. });
  69. var id = participant + track.getType() + idx;
  70. if(track.getType() == "video") {
  71. $("body").append("<video autoplay='1' id='" + participant + "video" + idx + "' />");
  72. } else {
  73. $("body").append("<audio autoplay='1' id='" + participant + "audio" + idx + "' />");
  74. }
  75. track.attach($("#" + id));
  76. }
  77. /**
  78. * That function is executed when the conference is joined
  79. */
  80. function onConferenceJoined () {
  81. console.log("conference joined!");
  82. isJoined = true;
  83. for(var i = 0; i < localTracks.length; i++)
  84. room.addTrack(localTracks[i]);
  85. }
  86. function onUserLeft(id) {
  87. if(!remoteTracks[id])
  88. return;
  89. var tracks = remoteTracks[id];
  90. for(var i = 0; i< tracks.length; i++)
  91. tracks[i].detach($("#" + id + tracks[i].getType()))
  92. }
  93. /**
  94. * That function is called when connection is established successfully
  95. */
  96. function onConnectionSuccess(){
  97. room = connection.initJitsiConference("conference2", confOptions);
  98. room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack);
  99. room.on(JitsiMeetJS.events.conference.TRACK_REMOVED, function (track) {
  100. console.log("track removed!!!" + track);
  101. });
  102. room.on(JitsiMeetJS.events.conference.CONFERENCE_JOINED, onConferenceJoined);
  103. room.on(JitsiMeetJS.events.conference.USER_JOINED, function(id){ remoteTracks[id] = [];});
  104. room.on(JitsiMeetJS.events.conference.USER_LEFT, onUserLeft);
  105. room.on(JitsiMeetJS.events.conference.TRACK_MUTE_CHANGED, function (track) {
  106. console.log(track.getType() + " - " + track.isMuted());
  107. });
  108. room.on(JitsiMeetJS.events.conference.DISPLAY_NAME_CHANGED, function (userID, displayName) {
  109. console.log(userID + " - " + displayName);
  110. });
  111. room.on(JitsiMeetJS.events.conference.TRACK_AUDIO_LEVEL_CHANGED,
  112. function(userID, audioLevel){
  113. console.log(userID + " - " + audioLevel);
  114. });
  115. room.join();
  116. };
  117. /**
  118. * This function is called when the connection fail.
  119. */
  120. function onConnectionFailed(){console.error("Connection Failed!")};
  121. /**
  122. * This function is called when we disconnect.
  123. */
  124. function disconnect(){
  125. console.log("disconnect!");
  126. connection.removeEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess);
  127. connection.removeEventListener(JitsiMeetJS.events.connection.CONNECTION_FAILED, onConnectionFailed);
  128. connection.removeEventListener(JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED, disconnect);
  129. }
  130. function unload() {
  131. for(var i = 0; i < localTracks.length; i++)
  132. localTracks[i].stop();
  133. room.leave();
  134. connection.disconnect();
  135. }
  136. $(window).bind('beforeunload', unload);
  137. $(window).bind('unload', unload);
  138. // JitsiMeetJS.setLogLevel(JitsiMeetJS.logLevels.ERROR);
  139. var initOptions = {
  140. disableAudioLevels: true,
  141. // Desktop sharing method. Can be set to 'ext', 'webrtc' or false to disable.
  142. desktopSharingChromeMethod: 'ext',
  143. // The ID of the jidesha extension for Chrome.
  144. desktopSharingChromeExtId: 'mbocklcggfhnbahlnepmldehdhpjfcjp',
  145. // The media sources to use when using screen sharing with the Chrome
  146. // extension.
  147. desktopSharingChromeSources: ['screen', 'window'],
  148. // Required version of Chrome extension
  149. desktopSharingChromeMinExtVersion: '0.1',
  150. // The ID of the jidesha extension for Firefox. If null, we assume that no
  151. // extension is required.
  152. desktopSharingFirefoxExtId: null,
  153. // Whether desktop sharing should be disabled on Firefox.
  154. desktopSharingFirefoxDisabled: true,
  155. // The maximum version of Firefox which requires a jidesha extension.
  156. // Example: if set to 41, we will require the extension for Firefox versions
  157. // up to and including 41. On Firefox 42 and higher, we will run without the
  158. // extension.
  159. // If set to -1, an extension will be required for all versions of Firefox.
  160. desktopSharingFirefoxMaxVersionExtRequired: -1,
  161. // The URL to the Firefox extension for desktop sharing.
  162. desktopSharingFirefoxExtensionURL: null
  163. }
  164. JitsiMeetJS.init(initOptions).then(function(){
  165. connection = new JitsiMeetJS.JitsiConnection(null, null, options);
  166. connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess);
  167. connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_FAILED, onConnectionFailed);
  168. connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED, disconnect);
  169. connection.connect();
  170. JitsiMeetJS.createLocalTracks({devices: ["audio", "video"]}).
  171. then(onLocalTracks).catch(function (error) {
  172. console.log(error);
  173. });
  174. }).catch(function (error) {
  175. console.log(error);
  176. });
  177. var connection = null;
  178. var room = null;
  179. var localTracks = [];
  180. var remoteTracks = {};