|
@@ -11,7 +11,7 @@ type imConnectStatus = 'connecting' | 'connected' | 'disconnect'
|
|
|
|
|
|
type VideoStatus = 'init' | 'stream' | 'liveing' | 'stopped' | 'error' | 'loading'
|
|
type VideoStatus = 'init' | 'stream' | 'liveing' | 'stopped' | 'error' | 'loading'
|
|
|
|
|
|
-type TrackType = 'microphone' | 'camera' | 'screen'
|
|
|
|
|
|
+export type TrackType = 'microphone' | 'camera' | 'screen'
|
|
|
|
|
|
type ActiveTracks = {
|
|
type ActiveTracks = {
|
|
[key in TrackType]: RTC.RCLocalTrack | null
|
|
[key in TrackType]: RTC.RCLocalTrack | null
|
|
@@ -25,6 +25,12 @@ export const START_LIVE_TIME = 'start-live-time'
|
|
|
|
|
|
export const START_LIVE_STATUS = 'start-live-status'
|
|
export const START_LIVE_STATUS = 'start-live-status'
|
|
|
|
|
|
|
|
+export const VIDEO_DEVICE_ID = 'video-deviceId'
|
|
|
|
+
|
|
|
|
+export const AUDIO_DEVICE_ID = 'audio-deviceId'
|
|
|
|
+
|
|
|
|
+export const AUDIO_DEVICE_VOLUME = 'audio-device-volume'
|
|
|
|
+
|
|
const runtime = reactive({
|
|
const runtime = reactive({
|
|
/** 房间id */
|
|
/** 房间id */
|
|
roomUid: 'LIVE-2112263-12345',
|
|
roomUid: 'LIVE-2112263-12345',
|
|
@@ -162,9 +168,15 @@ const Events = RongIMLib.Events
|
|
* @param Value 声音大小
|
|
* @param Value 声音大小
|
|
*/
|
|
*/
|
|
export const setVolume = (value: number) => {
|
|
export const setVolume = (value: number) => {
|
|
|
|
+ localStorage.setItem(AUDIO_DEVICE_VOLUME, value.toString())
|
|
if(runtime.videoRef) {
|
|
if(runtime.videoRef) {
|
|
runtime.videoRef.volume = value / 100
|
|
runtime.videoRef.volume = value / 100
|
|
}
|
|
}
|
|
|
|
+ // @ts-ignore
|
|
|
|
+ if (runtime.activeTracks.microphone && runtime.activeTracks.microphone._element) {
|
|
|
|
+ // @ts-ignore
|
|
|
|
+ runtime.activeTracks.microphone._element.volume = value / 100
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -184,7 +196,7 @@ export const setVideoSrcObject = (video: HTMLVideoElement | null, mediaStreams:
|
|
* 发起屏幕共享
|
|
* 发起屏幕共享
|
|
*/
|
|
*/
|
|
export const shareScreenVideo = async () => {
|
|
export const shareScreenVideo = async () => {
|
|
- if (runtime.rtcClient) {
|
|
|
|
|
|
+ if (runtime.rtcClient && !runtime.screenShareStatus) {
|
|
const screenTrack = await getTrack('screen')
|
|
const screenTrack = await getTrack('screen')
|
|
const oldTrack = runtime.activeTracks.camera as RTC.RCLocalTrack
|
|
const oldTrack = runtime.activeTracks.camera as RTC.RCLocalTrack
|
|
// removeTrack([oldTrack], 'camera')
|
|
// removeTrack([oldTrack], 'camera')
|
|
@@ -239,6 +251,7 @@ export const getCameras = async () => {
|
|
*/
|
|
*/
|
|
export const setSelectCamera = async (camera: MediaDeviceInfo) => {
|
|
export const setSelectCamera = async (camera: MediaDeviceInfo) => {
|
|
runtime.selectedCamera = camera
|
|
runtime.selectedCamera = camera
|
|
|
|
+ localStorage.setItem(VIDEO_DEVICE_ID, camera.deviceId)
|
|
const oldTrack = runtime.activeTracks.camera as RTC.RCLocalTrack
|
|
const oldTrack = runtime.activeTracks.camera as RTC.RCLocalTrack
|
|
if (oldTrack) {
|
|
if (oldTrack) {
|
|
await removeTrack([oldTrack], 'camera', oldTrack.isPublished())
|
|
await removeTrack([oldTrack], 'camera', oldTrack.isPublished())
|
|
@@ -254,6 +267,7 @@ export const setSelectCamera = async (camera: MediaDeviceInfo) => {
|
|
*/
|
|
*/
|
|
export const setSelectMicrophone = async (microphone: MediaDeviceInfo) => {
|
|
export const setSelectMicrophone = async (microphone: MediaDeviceInfo) => {
|
|
runtime.selectedMicrophone = microphone
|
|
runtime.selectedMicrophone = microphone
|
|
|
|
+ localStorage.setItem(AUDIO_DEVICE_ID, microphone.deviceId)
|
|
const oldTrack = runtime.activeTracks.microphone as RTC.RCLocalTrack
|
|
const oldTrack = runtime.activeTracks.microphone as RTC.RCLocalTrack
|
|
if (oldTrack) {
|
|
if (oldTrack) {
|
|
await removeTrack([oldTrack], 'microphone', oldTrack.isPublished())
|
|
await removeTrack([oldTrack], 'microphone', oldTrack.isPublished())
|
|
@@ -312,9 +326,14 @@ export const setTrack = async (tracks: RTC.RCLocalTrack[], trackType: TrackType,
|
|
for (const track of tracks) {
|
|
for (const track of tracks) {
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
// await runtime.mediaStreams?.addTrack(track._msTrack)
|
|
// await runtime.mediaStreams?.addTrack(track._msTrack)
|
|
|
|
+ if (trackType === 'microphone') {
|
|
|
|
+ console.log('添加麦克风')
|
|
|
|
+ track.play()
|
|
|
|
+ }
|
|
runtime.activeTracks[trackType] = track
|
|
runtime.activeTracks[trackType] = track
|
|
}
|
|
}
|
|
if (needPublish) {
|
|
if (needPublish) {
|
|
|
|
+ // console.log('publish', runtime.joinedRoom)
|
|
await runtime.joinedRoom?.publish(tracks)
|
|
await runtime.joinedRoom?.publish(tracks)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -323,17 +342,17 @@ export const setTrack = async (tracks: RTC.RCLocalTrack[], trackType: TrackType,
|
|
* @param track
|
|
* @param track
|
|
*/
|
|
*/
|
|
export const removeTrack = async (tracks: RTC.RCLocalTrack[], trackType: TrackType, needPublish = true) => {
|
|
export const removeTrack = async (tracks: RTC.RCLocalTrack[], trackType: TrackType, needPublish = true) => {
|
|
|
|
+ if (needPublish) {
|
|
|
|
+ await runtime.joinedRoom?.unpublish(tracks)
|
|
|
|
+ }
|
|
for (const track of tracks) {
|
|
for (const track of tracks) {
|
|
// @ts-ignore
|
|
// @ts-ignore
|
|
// await runtime.mediaStreams?.removeTrack(track._msTrack)
|
|
// await runtime.mediaStreams?.removeTrack(track._msTrack)
|
|
// runtime.activeTracks[trackType].destroy()
|
|
// runtime.activeTracks[trackType].destroy()
|
|
// console.log(runtime.activeTracks[trackType])
|
|
// console.log(runtime.activeTracks[trackType])
|
|
- track.destroy()
|
|
|
|
|
|
+ track?.destroy()
|
|
runtime.activeTracks[trackType] = null
|
|
runtime.activeTracks[trackType] = null
|
|
}
|
|
}
|
|
- if (needPublish) {
|
|
|
|
- await runtime.joinedRoom?.unpublish(tracks)
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
export const joinIMRoom = async (roomId: string, type: RTC.RCLivingType, listenEvents: RTC.IRoomEventListener | null) => {
|
|
export const joinIMRoom = async (roomId: string, type: RTC.RCLivingType, listenEvents: RTC.IRoomEventListener | null) => {
|
|
@@ -360,22 +379,24 @@ export const joinRoom = async (roomId: string, type: RTC.RCLivingType, listenEve
|
|
* 开始直播
|
|
* 开始直播
|
|
*/
|
|
*/
|
|
|
|
|
|
-export const startLive = async () => {
|
|
|
|
|
|
+export const startLive = async (resetTime = true) => {
|
|
if (runtime.videoStatus !== 'stream') throw Error('当前无视频流')
|
|
if (runtime.videoStatus !== 'stream') throw Error('当前无视频流')
|
|
const room = runtime.joinedRoom
|
|
const room = runtime.joinedRoom
|
|
if (room) {
|
|
if (room) {
|
|
- const microphoneAudioTrack = await getTrack('microphone')
|
|
|
|
- const cameraVideoTrack = await getTrack('camera')
|
|
|
|
- await setTrack([cameraVideoTrack], 'camera')
|
|
|
|
- await setTrack([microphoneAudioTrack], 'microphone')
|
|
|
|
- const builder = await runtime.joinedRoom?.getMCUConfigBuilder()
|
|
|
|
- // @ts-ignore
|
|
|
|
- await builder.setOutputVideoRenderMode?.(RTC.MixVideoRenderMode.WHOLE)
|
|
|
|
- // @ts-ignore
|
|
|
|
- await builder.flush()
|
|
|
|
|
|
+ // const microphoneAudioTrack = await getTrack('microphone')
|
|
|
|
+ // const cameraVideoTrack = await getTrack('camera')
|
|
|
|
+ // await setTrack([cameraVideoTrack], 'camera')
|
|
|
|
+ // await setTrack([microphoneAudioTrack], 'microphone')
|
|
|
|
+ // const builder = await runtime.joinedRoom?.getMCUConfigBuilder()
|
|
|
|
+ // // @ts-ignore
|
|
|
|
+ // await builder.setOutputVideoRenderMode?.(RTC.MixVideoRenderMode.WHOLE)
|
|
|
|
+ // // @ts-ignore
|
|
|
|
+ // await builder.flush()
|
|
runtime.videoStatus = 'liveing'
|
|
runtime.videoStatus = 'liveing'
|
|
}
|
|
}
|
|
- sessionStorage.setItem(START_LIVE_TIME, dayjs().valueOf().toString())
|
|
|
|
|
|
+ if (resetTime) {
|
|
|
|
+ sessionStorage.setItem(START_LIVE_TIME, dayjs().valueOf().toString())
|
|
|
|
+ }
|
|
sessionStorage.setItem(START_LIVE_STATUS, 'liveing')
|
|
sessionStorage.setItem(START_LIVE_STATUS, 'liveing')
|
|
}
|
|
}
|
|
|
|
|
|
@@ -484,8 +505,9 @@ export const openDevice = async (trackType: TrackType, needPublish = true) => {
|
|
export const closeDevice = async (trackType: TrackType, needPublish = true) => {
|
|
export const closeDevice = async (trackType: TrackType, needPublish = true) => {
|
|
const track = runtime.activeTracks[trackType]
|
|
const track = runtime.activeTracks[trackType]
|
|
if (trackType !== 'microphone') {
|
|
if (trackType !== 'microphone') {
|
|
|
|
+ // console.log('closeDevice', track)
|
|
|
|
+ // track?.destroy()
|
|
await removeTrack([track] as RTC.RCLocalTrack[], trackType, needPublish)
|
|
await removeTrack([track] as RTC.RCLocalTrack[], trackType, needPublish)
|
|
- track?.destroy()
|
|
|
|
} else {
|
|
} else {
|
|
track?.mute()
|
|
track?.mute()
|
|
}
|
|
}
|
|
@@ -507,3 +529,11 @@ export const toggleDevice = async (trackType: TrackType) => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+export const leaveIMRoom = async () => {
|
|
|
|
+ await closeLive()
|
|
|
|
+ if (runtime.joinedRoom) {
|
|
|
|
+ // @ts-ignore
|
|
|
|
+ await runtime.rtcClient?.leaveRoom(runtime.joinedRoom)
|
|
|
|
+ runtime.joinedRoom = null
|
|
|
|
+ }
|
|
|
|
+}
|