Browse Source

Merge branch 'master' of http://git.dayaedu.com/lex/dy-admin-live

lex-xin 3 năm trước cách đây
mục cha
commit
6d0e29f3ee

+ 10 - 2
src/components/live-broadcast/index.tsx

@@ -39,12 +39,20 @@ export default defineComponent({
         const join = await RuntimeUtils.joinRoom('w_3fi4PXQcooe5_VUseReE', RTC.RCLivingType.VIDEO, {
           onMessageReceive(name, content) {
             console.log(name, content)
+          },
+          onKickOff(byServer: boolean) {
+            console.log(byServer)
           }
         })
         if (join.code === RTC.RCRTCCode.SUCCESS && join.room) {
           runtime.joinedRoom = join.room
-          RuntimeUtils.setTrack([cameraVideoTrack])
-          RuntimeUtils.setTrack([microphoneAudioTrack])
+          await RuntimeUtils.setTrack([cameraVideoTrack], 'camera')
+          await RuntimeUtils.setTrack([microphoneAudioTrack], 'microphone')
+          const builder = await runtime.joinedRoom?.getMCUConfigBuilder()
+          // @ts-ignore
+          await builder.setOutputVideoRenderMode?.(RTC.MixVideoRenderMode.WHOLE)
+          // @ts-ignore
+          await builder.flush()
         }
       } catch (error) {
         runtime.videoStatus = 'error'

+ 24 - 12
src/components/live-broadcast/runtime.ts

@@ -9,6 +9,12 @@ type imConnectStatus = 'connecting' | 'connected' | 'disconnect'
 
 type VideoStatus = 'init' | 'stream' | 'liveing' | 'stopped' | 'error' | 'loading'
 
+type TrackType = 'microphone' | 'camera' | 'screen'
+
+type ActiveTracks = {
+  [key in TrackType]: RTC.RCLocalTrack | null
+}
+
 const runtime = reactive({
   /** IM连接状态 */
   imConnectStatus: 'connecting' as imConnectStatus,
@@ -39,7 +45,7 @@ const runtime = reactive({
   // 上一次点赞数量
   lastLikeCount: 0,
   /** 当前活跃的数据流 */
-  // activeTracks null as RTC.RCLiveStream | null,
+  activeTracks: {} as ActiveTracks,
 })
 
 export default runtime
@@ -75,7 +81,9 @@ const Events = RongIMLib.Events
  })
 
  for (const Message of Object.values(RestMessage)) {
-   RongIMLib.addEventListener(Message, () => {
+   RongIMLib.addEventListener(Message, (evt: any) => {
+     console.log(Message, evt)
+    //  chatroomDestroyed
     event.emit(Message, {$EventMessage: null})
    })
  }
@@ -128,11 +136,13 @@ export const setVideoSrcObject = (video: HTMLVideoElement | null, mediaStreams:
 export const shareScreenVideo = async () => {
   if (runtime.rtcClient) {
     const screenTrack = await getTrack('screen')
-    console.log(screenTrack)
-    setTrack([screenTrack as RTC.RCLocalTrack])
+    const oldTrack = runtime.activeTracks.camera as RTC.RCLocalTrack
+    removeTrack([oldTrack], 'camera')
+    setTrack([screenTrack as RTC.RCLocalTrack], 'screen')
     screenTrack?.on(RTC.RCLocalTrack.EVENT_LOCAL_TRACK_END, (track: RTC.RCLocalTrack) => {
       runtime.screenShareStatus = false
-      console.log('end')
+      removeTrack([track], 'screen')
+      setTrack([oldTrack as RTC.RCLocalTrack], 'camera')
       // setVideoSrcObject(runtime.videoRef, this.mediaStreams)
     })
 
@@ -184,7 +194,7 @@ type TrackResult = {
   track: RTC.RCMicphoneAudioTrack | RTC.RCCameraVideoTrack | RTC.RCScreenVideoTrack | undefined
 }
 
-export const getTrack = async (trackType: 'microphone' | 'camera' | 'screen'): Promise<RTC.RCLocalTrack> => {
+export const getTrack = async (trackType: TrackType): Promise<RTC.RCLocalTrack> => {
   let res: TrackResult | undefined
   let Track: RTC.RCLocalTrack | null = null
   if (trackType === 'microphone') {
@@ -213,23 +223,25 @@ export const getTrack = async (trackType: 'microphone' | 'camera' | 'screen'): P
  * 添加视频流,会同步修改当先视频与推送的流
  * @param track
  */
-export const setTrack = (tracks: [RTC.RCLocalTrack]) => {
+export const setTrack = async (tracks: RTC.RCLocalTrack[], trackType: TrackType) => {
   for (const track of tracks) {
     // @ts-ignore
-    runtime.mediaStreams?.addTrack(track._msTrack)
+    await runtime.mediaStreams?.addTrack(track._msTrack)
+    runtime.activeTracks[trackType] = track
   }
-  runtime.joinedRoom?.publish(tracks)
+  await runtime.joinedRoom?.publish(tracks)
 }
 /**
  * 删除视频流,会同步修改当先视频与推送的流
  * @param track
  */
-export const removeTrack = (tracks: [RTC.RCLocalTrack]) => {
+export const removeTrack = async (tracks: RTC.RCLocalTrack[], trackType: TrackType) => {
   for (const track of tracks) {
     // @ts-ignore
-    runtime.mediaStreams?.removeTrack(track._msTrack)
+    await runtime.mediaStreams?.removeTrack(track._msTrack)
+    runtime.activeTracks[trackType] = null
   }
-  runtime.joinedRoom?.unpublish(tracks)
+  await runtime.joinedRoom?.unpublish(tracks)
 }
 
 export const joinRoom = async (roomId: string, type: RTC.RCLivingType, listenEvents: RTC.IRoomEventListener | null) => {