gaoluyang
昨天 b64a0deae5b5d33f9e20671a68936b27f0b9b00b
src/views/im/home/composables/useMediaStreamElement.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
import { type VNodeRef, watch } from 'vue'
/**
 * æŠŠå“åº”式 MediaStream æŒ‚到 `<video>` / `<audio>` å…ƒç´ çš„ srcObject ä¸Šï¼›
 * stream ä¸ºç©ºæ—¶æ¸…掉 srcObject,避免设备关闭后画面卡在最后一帧
 */
export function useMediaStreamElement<T extends HTMLMediaElement>(
  streamSource: () => MediaStream | null | undefined
): VNodeRef {
  let el: T | null = null
  let currentStream: MediaStream | null | undefined
  const syncStream = () => {
    if (el) {
      el.srcObject = currentStream || null
    }
  }
  watch(
    streamSource,
    (stream) => {
      currentStream = stream
      syncStream()
    },
    { flush: 'post', immediate: true }
  )
  return (value) => {
    if (value instanceof HTMLMediaElement) {
      el = value as T
      syncStream()
      return
    }
    if (el) {
      el.srcObject = null
    }
    el = null
  }
}