视频会议
This commit is contained in:
@@ -450,6 +450,22 @@ const swapPrimaryTile = () => {
|
||||
preferSelfMain.value = !preferSelfMain.value
|
||||
}
|
||||
|
||||
// 关键:在用户点击的"手势作用域"内自己 getUserMedia,把 track 传给 meetingStore,
|
||||
// 避免 mediasoup 内部二次 getUserMedia 被 WebView 拒(NotAllowedError Permission denied)。
|
||||
const acquireAudioTrack = async () => {
|
||||
if (!navigator?.mediaDevices?.getUserMedia) throw new Error('当前环境不支持 getUserMedia')
|
||||
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false })
|
||||
return stream.getAudioTracks()[0]
|
||||
}
|
||||
const acquireVideoTrack = async () => {
|
||||
if (!navigator?.mediaDevices?.getUserMedia) throw new Error('当前环境不支持 getUserMedia')
|
||||
const stream = await navigator.mediaDevices.getUserMedia({
|
||||
audio: false,
|
||||
video: { width: { ideal: 640 }, height: { ideal: 480 }, facingMode: 'user' }
|
||||
})
|
||||
return stream.getVideoTracks()[0]
|
||||
}
|
||||
|
||||
const onMicToggle = async () => {
|
||||
pushDebug(`mic点击 loading=${audioLoading.value} leaving=${leaving.value} on=${audioEnabled.value} producer=${meetingStore.localProducers?.audio || 'null'}`)
|
||||
if (audioLoading.value || leaving.value) {
|
||||
@@ -463,8 +479,11 @@ const onMicToggle = async () => {
|
||||
await meetingStore.stopLocalAudio()
|
||||
pushDebug('mic stop 完成')
|
||||
} else {
|
||||
pushDebug('mic -> startLocalAudio')
|
||||
await meetingStore.startLocalAudio()
|
||||
pushDebug('mic -> getUserMedia(audio)')
|
||||
const track = await acquireAudioTrack()
|
||||
pushDebug(`mic 拿到 track id=${track?.id?.slice(0, 8)} label=${track?.label || ''}`)
|
||||
pushDebug('mic -> startLocalAudio(track)')
|
||||
await meetingStore.startLocalAudio(undefined, track)
|
||||
pushDebug(`mic start 完成 enabled=${meetingStore.localAudioEnabled}`)
|
||||
localMediaError.value = ''
|
||||
}
|
||||
@@ -489,8 +508,11 @@ const onCamToggle = async () => {
|
||||
await meetingStore.stopLocalVideo()
|
||||
pushDebug('cam stop 完成')
|
||||
} else {
|
||||
pushDebug('cam -> startLocalVideo')
|
||||
await meetingStore.startLocalVideo()
|
||||
pushDebug('cam -> getUserMedia(video)')
|
||||
const track = await acquireVideoTrack()
|
||||
pushDebug(`cam 拿到 track id=${track?.id?.slice(0, 8)} label=${track?.label || ''}`)
|
||||
pushDebug('cam -> startLocalVideo(track)')
|
||||
await meetingStore.startLocalVideo(undefined, track)
|
||||
pushDebug(`cam start 完成 enabled=${meetingStore.localVideoEnabled}`)
|
||||
localMediaError.value = ''
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user