✨ feat(im): 修复摄像头关闭后画面卡在最后一帧(pickStream 短路 mute 状态)
parent
ae7f3a8bc5
commit
12a41da241
|
|
@ -98,6 +98,9 @@ export function useLiveKitRoom() {
|
||||||
})
|
})
|
||||||
.on(RoomEvent.TrackSubscribed, () => syncRemotes(r))
|
.on(RoomEvent.TrackSubscribed, () => syncRemotes(r))
|
||||||
.on(RoomEvent.TrackUnsubscribed, () => syncRemotes(r))
|
.on(RoomEvent.TrackUnsubscribed, () => syncRemotes(r))
|
||||||
|
// mute / unmute 让 pickStream 的 isMuted 短路重算,video 元素能解绑 srcObject 而不是卡最后一帧
|
||||||
|
.on(RoomEvent.TrackMuted, () => syncRemotes(r))
|
||||||
|
.on(RoomEvent.TrackUnmuted, () => syncRemotes(r))
|
||||||
.on(RoomEvent.ConnectionQualityChanged, (quality) => {
|
.on(RoomEvent.ConnectionQualityChanged, (quality) => {
|
||||||
connectionQuality.value = quality
|
connectionQuality.value = quality
|
||||||
})
|
})
|
||||||
|
|
@ -241,12 +244,16 @@ export function useLiveKitRoom() {
|
||||||
/**
|
/**
|
||||||
* 取参与者指定来源的轨道并打包为 MediaStream;
|
* 取参与者指定来源的轨道并打包为 MediaStream;
|
||||||
* 参与者走 unknown 是因为响应式系统会丢失 livekit-client 的类签名,函数内手动 cast 回参与者类型;
|
* 参与者走 unknown 是因为响应式系统会丢失 livekit-client 的类签名,函数内手动 cast 回参与者类型;
|
||||||
* 命中缓存返回同一 MediaStream 引用,下游 watch / srcObject 无需重挂
|
* 命中缓存返回同一 MediaStream 引用,下游 watch / srcObject 无需重挂;
|
||||||
|
* 轨道被 mute(本端关摄像头 / 远端关摄像头)时返回 null,让 video 元素解绑 srcObject 而不是卡在最后一帧
|
||||||
*/
|
*/
|
||||||
function pickStream(participant: unknown, source: Track.Source): MediaStream | null {
|
function pickStream(participant: unknown, source: Track.Source): MediaStream | null {
|
||||||
const p = participant as Participant
|
const p = participant as Participant
|
||||||
const pub = p.getTrackPublication(source)
|
const pub = p.getTrackPublication(source)
|
||||||
const track = pub?.track?.mediaStreamTrack
|
if (!pub || pub.isMuted) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
const track = pub.track?.mediaStreamTrack
|
||||||
if (!track) {
|
if (!track) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue