javascript - MediaSource 从不在 React 中发出 sourceopen 事件

标签 javascript reactjs media-source

我正在尝试在 React 自定义 Hook 中使用 Javascript 的 MediaSource API 流式传输视频文件。

这是我的代码片段:

const useMyHook = (videoRef: React.MutableRefObject<HTMLVideoElement | null>) => {
...
  useEffect(() => {
    const mediaSource = new MediaSource();
    videoRef.current!.src = URL.createObjectURL(mediaSource);
    mediaSource.addEventListener('sourceopen', () => {
      // this never happens
    });
  }, []);
...
}
const MyComponent = () => {
  const videoRef = useRef<HTMLVideoElement | null>(null);
  const {} = useMyHook(videoRef);

  return (
    <>
      <video ref={videoRef} controls />;
    </>
  );
};

看起来 mediaSource 从未发出 'sourceopen' 事件。

此外,当我尝试在不同的项目中使用简单的 html 和 javascript 时,它工作正常。

我试图使用 document.getElementByTagName 而不是 useRef 或直接在我的组件中使用它,但结果相同。

有人能告诉我这是什么问题吗? React 什么的有什么问题吗?

最佳答案

在整个组件范围内实例化和维护 MediaSource 的状态:

import React, { useState, useEffect, useRef } from 'react'

const MyComponent = () => {
  const [mediaSource] = useState(new MediaSource())
  const videoRef = useRef<HTMLVideoElement | null>(null)

  // component init
  useEffect(() => {
    mediaSource.addEventListener('sourceopen', ...)
  }, [])

  // videoRef changes
  useEffect(() => {
    videoRef?.current!.src = URL.createObjectURL(mediaSource)
  }, [videoRef])
};

关于javascript - MediaSource 从不在 React 中发出 sourceopen 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70717575/

相关文章:

javascript - 计算 Javascript 中正则表达式的匹配次数

javascript - 媒体源 api 源缓冲区追加不起作用

javascript - 寻找一个函数来执行比 underscore.js 扩展函数更复杂的工作

javascript - 文本淡入后加载 Bootstrap slider

javascript - 使用 AsyncStorage 更新状态 - React Native

reactjs - 需要使用react-redux进行身份验证的延迟加载组件

javascript - 如何将下一个/图像组件设置为 100% 高度

reactjs - Redux with Gatsby - 无法识别包装的提供程序

javascript - 在 Chrome 中创建 MediaStream 对象?

javascript - 如何使用媒体源扩展以无缝循环播放视频