您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

example.js 8.5KB

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