live.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. import {getDataSet, getEventParam, toast} from "../../utils/utils";
  2. import {liveSources, LOG_TAGS} from "../../model/enum";
  3. import {timStore} from "../../store/tim";
  4. import {createStoreBindings} from "mobx-miniprogram-bindings";
  5. import Tim from "../../model/tim";
  6. import User from "../../model/user";
  7. import EduTRTC from "../../model/edu-trct";
  8. import Route from "../../model/route";
  9. // var log = require('../../utils/log.js') // 引用上面的 log.js 文件
  10. import MyLogManager from "../../utils/log";
  11. var log = new MyLogManager(LOG_TAGS.LIVE);
  12. // var testLog = new MyLogManager('test');
  13. Page({
  14. data: {
  15. liveSourcesEnum: liveSources,
  16. user: {},
  17. groupId: '',
  18. pic: '',
  19. userSig: '',
  20. scheduleId: '',
  21. isFull: false,
  22. isRotate:false,
  23. bigIndex: 0,
  24. isLive: false,
  25. hasRotate:false,
  26. // pageOptions: {}
  27. },
  28. async onLoad(options) {
  29. // wx.setKeepScreenOn({
  30. // keepScreenOn: true,
  31. // })
  32. // 退出时 退房处理 使用 ↓
  33. // this.storeBindings = createStoreBindings(this, {
  34. // store: timStore,
  35. // fields: ['isCanShare', 'isAudVideo', 'isAudText', 'isStuVideo', 'pusher', 'playerList', 'handReply'],
  36. // actions: ['setScroll', 'setHandReply', 'pushMessage', 'resetMessage', 'logout', 'initLive', "exitRoom",
  37. // "setPusherAttributesHandler",
  38. // "setPlayerAttributesHandler"]
  39. // })
  40. // this.setData({
  41. // pageOptions: options
  42. // });
  43. // const title = options.title;
  44. // wx.setNavigationBarTitle({title})
  45. //原来的 ↓
  46. wx.setKeepScreenOn({
  47. keepScreenOn: true,
  48. })
  49. this.storeBindings = createStoreBindings(this, {
  50. store: timStore,
  51. fields: ['isCanShare', 'isAudVideo', 'isAudText', 'isStuVideo', 'pusher', 'playerList', 'handReply'],
  52. actions: ['setScroll', 'setHandReply', 'pushMessage', 'resetMessage', 'logout', 'initLive', "exitRoom",
  53. "setPusherAttributesHandler",
  54. "setPlayerAttributesHandler"]
  55. })
  56. const {title, type, eId, scheduleId, eduStuName,pic} = options;
  57. let userID = "";
  58. let groupId = "";
  59. if (type == liveSources.DEFAULT) {
  60. userID = "student_" + eId;
  61. } else if (type == liveSources.GUEST) {
  62. userID = "guest_" + eId;
  63. }
  64. groupId = "schedule_" + scheduleId;
  65. const res = await User.getUserSign(userID);
  66. const userSig = res.userSig
  67. Tim.SDKAppID = res.appID;
  68. this.setData({
  69. type,
  70. user: {nickname: eduStuName, avatar: '', gender: 1, userID},
  71. groupId,
  72. scheduleId,
  73. userSig,
  74. pic
  75. }, () => {
  76. console.log('群组ID: ', groupId);
  77. log.info('onload 设置的群组ID: ', groupId);
  78. this.initLive(this);
  79. // 为了防止直播画面不显示 ↓
  80. setTimeout(() => EduTRTC.getInstance().getSDK().getPusherInstance().start(), 800)
  81. });
  82. wx.setNavigationBarTitle({title})
  83. },
  84. // async onShow(){
  85. // console.log('onShow -> live');
  86. // wx.setKeepScreenOn({
  87. // keepScreenOn: true,
  88. // });
  89. // const {type, eId, scheduleId, eduStuName,pic} = this.data.pageOptions;
  90. // let userID = "";
  91. // let groupId = "";
  92. // if (type == liveSources.DEFAULT) {
  93. // userID = "student_" + eId;
  94. // } else if (type == liveSources.GUEST) {
  95. // userID = "guest_" + eId;
  96. // }
  97. // groupId = "schedule_" + scheduleId;
  98. // const res = await User.getUserSign(userID);
  99. // const userSig = res.userSig
  100. // Tim.SDKAppID = res.appID;
  101. // this.setData({
  102. // type,
  103. // user: {nickname: eduStuName, avatar: '', gender: 1, userID},
  104. // groupId,
  105. // scheduleId,
  106. // userSig,
  107. // pic
  108. // }, () => {
  109. // console.log('群组ID: ', groupId);
  110. // log.info('onload 设置的群组ID: ', groupId);
  111. // this.initLive(this);
  112. // // 为了防止直播画面不显示 ↓
  113. // setTimeout(() => EduTRTC.getInstance().getSDK().getPusherInstance().start(), 800)
  114. // });
  115. // },
  116. async reply(e) {
  117. let msg = getEventParam(e, "msg")
  118. if (!msg.trim()) {
  119. toast('请输入内容')
  120. return;
  121. }
  122. const message = Tim.getInstance().createGroupTextMsg(msg, this.data.groupId);
  123. this.setScroll(true)
  124. try {
  125. await Tim.getInstance().sendMessage(message);
  126. this.pushMessage(message)
  127. this.selectComponent('.bottom-reply').clear();
  128. } catch (e) {
  129. toast(e.message)
  130. }
  131. },
  132. async hand(e) {
  133. const message = Tim.getInstance().createHandMsg(this.data.groupId);
  134. const res = await Tim.getInstance().sendCMD(message, ({code}) => {
  135. if (code == 10017) {
  136. toast('举手失败:禁言情况不能举手');
  137. this.setHandReply(!this.data.handReply);
  138. }
  139. });
  140. },
  141. // async handleLeaveRoom(){
  142. // wx.setKeepScreenOn({
  143. // keepScreenOn: false,
  144. // })
  145. // this.exitRoom()
  146. // await this.logout()
  147. // // this.storeBindings.destroyStoreBindings()
  148. // },
  149. // onSaveExitState(){
  150. // testLog.info('exit room');
  151. // this.handleLeaveRoom();
  152. // console.log('exitRoom -> live');
  153. // },
  154. // onHide(){
  155. // console.log('exit');
  156. // testLog.info('exit room');
  157. // this.handleLeaveRoom();
  158. // },
  159. async onUnload() {
  160. wx.setKeepScreenOn({
  161. keepScreenOn: false,
  162. })
  163. this.exitRoom()
  164. await this.logout()
  165. this.storeBindings.destroyStoreBindings()
  166. // this.handleLeaveRoom();
  167. // this.storeBindings.destroyStoreBindings();
  168. },
  169. changeFull(e) {
  170. let playerList = this.data.playerList[this.data.bigIndex];
  171. this.rotate();
  172. // if (this.data.bigIndex==-1 || playerList.userID.indexOf("student") !=-1
  173. // || playerList.userID.indexOf("guest_") !=-1 ){
  174. // this.setData({
  175. // isFull: !this.data.isFull
  176. // })
  177. // }
  178. // else{
  179. // this.rotate();
  180. // }
  181. },
  182. handlePusher(e) {
  183. console.log("handlePusher", e)
  184. },
  185. handlePlayer(e) {
  186. if(this.data.isRotate){
  187. console.log("旋转状态下不允许切换了");
  188. return;
  189. }
  190. console.log("handlePlayer", e)
  191. let index = getDataSet(e, 'index');
  192. if (this.data.bigIndex == index || (index == -1 && !this.data.pusher.enableCamera)) {
  193. return;
  194. }
  195. this.setData({
  196. bigIndex: index
  197. })
  198. },
  199. switchCamera() {
  200. wx.createLivePusherContext().switchCamera({
  201. success() {
  202. },
  203. fail() {
  204. toast("切换失败")
  205. },
  206. }
  207. )
  208. },
  209. quitLink() {
  210. this.setPusherAttributesHandler({enableCamera: false, enableMic: false})
  211. },
  212. // 请保持跟 wxml 中绑定的事件名称一致
  213. _pusherStateChangeHandler(event) {
  214. console.log("_pusherStateChangeHandler************", event);
  215. const code = getEventParam(event, "code")
  216. if (code == 1018) {
  217. this.setData({
  218. isLive: true
  219. })
  220. }
  221. EduTRTC.getInstance().getSDK().pusherEventHandler(event)
  222. },
  223. _pusherNetStatusHandler(event) {
  224. EduTRTC.getInstance().getSDK().pusherNetStatusHandler(event)
  225. // try{
  226. // EduTRTC.getInstance().getSDK().pusherNetStatusHandler(event)
  227. // } catch(err) {
  228. // console.log('_pusherNetStatusHandler error:', err);
  229. // }
  230. },
  231. _pusherErrorHandler(event) {
  232. console.log("_pusherErrorHandler", event);
  233. EduTRTC.getInstance().getSDK().pusherErrorHandler(event)
  234. },
  235. _pusherBGMStartHandler(event) {
  236. EduTRTC.getInstance().getSDK().pusherBGMStartHandler(event)
  237. },
  238. _pusherBGMProgressHandler(event) {
  239. EduTRTC.getInstance().getSDK().pusherBGMProgressHandler(event)
  240. },
  241. _pusherBGMCompleteHandler(event) {
  242. EduTRTC.getInstance().getSDK().pusherBGMCompleteHandler(event)
  243. },
  244. _pusherAudioVolumeNotify(event) {
  245. EduTRTC.getInstance().getSDK().pusherAudioVolumeNotify(event)
  246. },
  247. _playerStateChange(event) {
  248. console.log("_playerStateChange", event);
  249. EduTRTC.getInstance().getSDK().playerEventHandler(event)
  250. },
  251. _playerFullscreenChange(event) {
  252. EduTRTC.getInstance().getSDK().playerFullscreenChange(event)
  253. let playerList = this.data.playerList[this.data.bigIndex];
  254. console.log("event",event)
  255. if (event.detail.fullScreen){
  256. this.setPlayerAttributesHandler(playerList,{objectFit:'contain'})
  257. }else{
  258. this.setPlayerAttributesHandler(playerList,{objectFit:'fillCrop'})
  259. }
  260. },
  261. _playerNetStatus(event) {
  262. EduTRTC.getInstance().getSDK().playerNetStatus(event)
  263. },
  264. _playerAudioVolumeNotify(event) {
  265. EduTRTC.getInstance().getSDK().playerAudioVolumeNotify(event)
  266. },
  267. onShareAppMessage(options) {
  268. let obj = {};
  269. if (this.data.pic){
  270. obj.imageUrl = this.data.pic
  271. }
  272. return {
  273. path: Route.getIndexUrl(this.data.scheduleId),
  274. ...obj
  275. }
  276. },
  277. rotate(){
  278. let that = this;
  279. let playerList = this.data.playerList[this.data.bigIndex];
  280. let livePlayerContext = wx.createLivePlayerContext(playerList.id);
  281. console.log(livePlayerContext)
  282. livePlayerContext.requestFullScreen({
  283. direction:90,
  284. success(res) {
  285. that.setData({isRotate:true})
  286. },
  287. fail(e){
  288. toast("屏幕旋转失败,请稍后重试")
  289. console.log(e)
  290. }
  291. })
  292. },
  293. rotate2(){
  294. this.setPusherAttributesHandler({enableCamera: true, enableMic: true})
  295. },
  296. exitRotate(){
  297. let that = this;
  298. let playerList = this.data.playerList[this.data.bigIndex];
  299. let livePlayerContext = wx.createLivePlayerContext(playerList.id);
  300. console.log(livePlayerContext)
  301. livePlayerContext.exitFullScreen({
  302. success(res) {
  303. that.setData({isRotate:false})
  304. },
  305. fail(e){
  306. toast("屏幕旋转失败,请稍后重试")
  307. console.log(e)
  308. }
  309. })
  310. },
  311. //放大pusher的方法(就是改变pusher控件的大小)
  312. //放大player的方法
  313. testPlayerFullScreen(id) {
  314. let livePlayerContext = wx.createLivePlayerContext(id);
  315. //进入全屏
  316. let direction = 0;
  317. let item = this.data.playerList[0];//item是流集合里的一个
  318. // // 已知问题:视频的尺寸需要等待player触发NetStatus事件才能获取到,如果进房就双击全屏,全屏后的方向有可能不对。
  319. if (item.netStatus && item.netStatus.videoWidth && item.netStatus.videoHeight) {
  320. // 如果是横视频,全屏时进行横屏处理。如果是竖视频,则为0
  321. direction = item.netStatus.videoWidth > item.netStatus.videoHeight ? 90 : 0
  322. }
  323. livePlayerContext.requestFullScreen({
  324. direction,
  325. success(res) {
  326. }
  327. })
  328. //退出全屏
  329. livePlayerContext.exitFullScreen({
  330. success(res) {
  331. }
  332. })
  333. }
  334. });