common.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. import store from '@/store';
  2. import { Message } from 'element-ui';
  3. import i18n from '@/locales/i18n';
  4. /**
  5. * WebSDK 实例化对象
  6. */
  7. /* eslint-disable-next-line init-declarations */
  8. export let rtc;
  9. /**
  10. * 初始化SDK方法
  11. * @param { Object } data 初始化SDK所需参数
  12. * @returns { Object } Rtc
  13. */
  14. export function initSDK(data) {
  15. rtc = new Rtc(data);
  16. return rtc;
  17. }
  18. /**
  19. * 查询直播是否开启
  20. */
  21. export function getLiveStat(obj) {
  22. rtc.getLiveStat(obj);
  23. }
  24. /**
  25. * 下麦操作
  26. * @param { String } uid
  27. */
  28. export function handsDown(Object) {
  29. rtc.handsDown(Object);
  30. }
  31. /**
  32. * 上麦更新
  33. * @param { Object } stream
  34. */
  35. export function updateMcResult(stid, pid) {
  36. // 上麦更新是在两种情况下执行
  37. // 1.推流成功之后将自己的麦序更新为3;系统会广播 speak_context 事件,其他用户监听该事件后更新对应的业务展示状态;
  38. // 2.不能创建本地流或者推流失败,更新自己的麦序为0。
  39. rtc.updateMcResult({
  40. pid,
  41. stid,
  42. success(data) {
  43. console.log('更新上麦结果请求成功,此处可处理应用层逻辑', data);
  44. },
  45. fail(data) {
  46. console.log(`更新上麦结果请求失败:${JSON.stringify(data)}`);
  47. }
  48. });
  49. }
  50. /**
  51. * 推送本地流
  52. */
  53. export function publishStream(streamName) {
  54. rtc.publish({
  55. streamName,
  56. // 推流成功,更新上麦结果
  57. success: (stream) => {
  58. console.log('推流成功', stream);
  59. updateMcResult(stream.id(), 1);
  60. },
  61. fail: (str) => {
  62. // 推流失败,更新上麦结果
  63. console.log('推流失败,更新上麦结果', str);
  64. updateMcResult('', 0);
  65. }
  66. });
  67. }
  68. /**
  69. * 得到创建本地流参数对象
  70. */
  71. export function createData() {
  72. const device = store.state.app.liveDevice;
  73. const video = device.video.length > 0 ? { device: 'camera', resolution: 'sif', deviceId: device.video } : false;
  74. const audio = device.audio.length > 0 ? { deviceId: device.audio } : false;
  75. return {
  76. video,
  77. audio
  78. };
  79. }
  80. /**
  81. * 创建本地流
  82. */
  83. export function createLocalStream(streamName) {
  84. rtc.createLocalStream({
  85. streamName,
  86. createData: createData(),
  87. success(stream) {
  88. console.log('创建本地流成功', stream);
  89. // 创建本地流成功,将流展示到id为 live 的dom元素盒子中
  90. stream.show('live');
  91. publishStream(streamName); // 如果需要立即推流,执行 publish 方法
  92. },
  93. fail(data) {
  94. // 创建本地流失败,应用层处理
  95. Message({
  96. type: 'error',
  97. message: `${i18n.t('Key441')}:${data}`
  98. });
  99. }
  100. });
  101. }
  102. /**
  103. * 结束本地流
  104. */
  105. export function closeVideo(streamName) {
  106. rtc.closeVideo({
  107. streamName,
  108. success() {
  109. console.log('结束本地流成功');
  110. },
  111. fail(str) {
  112. console.log(str);
  113. }
  114. });
  115. }
  116. // 重连
  117. export function reconnection() {
  118. rtc.closeVideo({
  119. streamName: 'main',
  120. success() {
  121. createLocalStream('main');
  122. },
  123. fail(str) {
  124. console.log(str);
  125. }
  126. });
  127. }
  128. /**
  129. * 关闭本地流声音
  130. */
  131. export function pauseAudio(options) {
  132. rtc.pauseAudio(options);
  133. }
  134. /**
  135. * 开启本地流声音
  136. */
  137. export function playAudio(options) {
  138. rtc.playAudio(options);
  139. }
  140. /**
  141. * 关闭本地流视频画面
  142. */
  143. export function pauseVideo(options) {
  144. rtc.pauseVideo(options);
  145. }
  146. /**
  147. * 开启本地流视频画面
  148. */
  149. export function playVideo(options) {
  150. rtc.playVideo(options);
  151. }
  152. /**
  153. * 获取设备列表
  154. */
  155. export function getDevice(options) {
  156. rtc.getDevice(options);
  157. }
  158. // 查询网络节点
  159. export function getNetPoint() {
  160. rtc.getNetPoint({
  161. success(data) {
  162. console.log('获取网络节点成功', data);
  163. }
  164. });
  165. }
  166. /**
  167. * 获取历史记录
  168. * 用于获取当前直播中房间的文档翻页,画笔,聊天的历史记录
  169. */
  170. export function getHistory(options) {
  171. rtc.getHistory(options);
  172. }
  173. /**
  174. * 房间配置项更新
  175. * @param {Object} option 房间配置项 (具体看2.0 https://doc.bokecc.com/class/developer/web/chat.html),以键值对的形式传
  176. */
  177. export function roomUpdate(option) {
  178. rtc.roomUpdate(option);
  179. }
  180. // 自定义消息发送事件
  181. export function sendPublishMessage(data) {
  182. rtc.sendPublishMessage(data);
  183. }
  184. // 聊天组件
  185. /**
  186. * 发送聊天
  187. * @param {String} msg length不能超过 400
  188. */
  189. export function sendMsg(msg) {
  190. rtc.sendMsg(msg);
  191. }
  192. // 文档
  193. /**
  194. * 变更画笔
  195. */
  196. export function drawChange(action, value) {
  197. rtc.drawChange({
  198. action,
  199. value
  200. });
  201. }
  202. export function createScript(url) {
  203. const script = document.createElement('script');
  204. script.type = 'text/javascript';
  205. script.src = url;
  206. document.getElementsByTagName('body')[0].appendChild(script);
  207. return script;
  208. }
  209. function createLink(url) {
  210. const link = document.createElement('link');
  211. link.rel = 'stylesheet';
  212. link.href = url;
  213. document.getElementsByTagName('body')[0].appendChild(link);
  214. return link;
  215. }
  216. // 加载直播所需 SDK,加载完成后才能初始化
  217. export function downloadWebSDK(vue) {
  218. createLink('https://class.csslcloud.net/static/SDK/docSDK/draw.css').onload = () => {
  219. vue.loadedNumber += 1;
  220. };
  221. createScript('https://class.csslcloud.net/sdk/websdk/hdRtc-6.7.2.js').onload = () => {
  222. [
  223. 'https://class.csslcloud.net/static/dist/js/classMode.js',
  224. 'https://class.csslcloud.net/static/dist/js/classUpdateChat.js',
  225. 'https://image.csslcloud.net/js/dpc.js',
  226. 'https://class.csslcloud.net/static/js/jquery/jquery.min.js'
  227. ].forEach((item) => {
  228. createScript(item).onload = () => {
  229. vue.loadedNumber += 1;
  230. };
  231. });
  232. };
  233. }
  234. // 聊天列表滚动
  235. export function chatRoll(vue, isGroup = true) {
  236. const chat = vue.$refs.chat;
  237. const isBottom = chat.scrollTop >= chat.scrollHeight - (isGroup ? 170 : 310);
  238. vue.$nextTick(() => {
  239. if (isBottom) {
  240. chat.scrollTop = chat.scrollHeight;
  241. }
  242. });
  243. }