reactjs - VideoJS 程序化播放仅适用于 setTimeout
问题描述
基本上,当我单独调用 player.play() 时,视频不会播放,但是当我将其包装在 setTimeout 中(即使是 1ms)时,视频会播放。
我的应用是用 NextJS 在 React 中构建的。
以下是代码的外观:
const [currentVideoElement, setCurrentVideoElement] = useState(null);
useEffect(() => {
if (!currentVideoElement) {
return undefined;
}
const currentVideoPlayer = videojs(currentVideoElement, {
autoplay: true,
controls: false,
loop: true,
preload: 'auto',
});
currentVideoPlayer.ready(() => {
// Should be just: currentVideoPlayer.play();
setTimeout(() => currentVideoPlayer.play(), 1);
currentVideoPlayer.muted(
isCurrentVideoMuted || !isCurrentVideoFullScreen
);
});
return () => {
currentVideoPlayer.pause();
currentVideoPlayer.currentTime(0);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [currentVideoElement]);
视频元素如下:
<video
className="video-js vjs-custom h-full object-cover"
playsInline
muted
ref={setCurrentVideoElement}
>
<source src={url} type="video/mp4" />
</video>
现在这可行,但很想了解为什么会这样!
解决方案
推荐阅读
- python - 如何在运行时获取打开的 Mongo 连接数?
- c# - 实体框架核心缺少参数“提供者”
- c# - 无法通过动态 POST 文件名(某种类型)打开文件 Groupdocs 注释
- bash - 通过 Cron 作业上传当天的备份而不是所有文件
- java - 无法覆盖 cookie
- javascript - 如何通过使用 lodash 连接嵌套数组对象来生成新数组
- sql - 是否有从数组到 MonetDBe 的批量加载选项
- r - 如何使用 R 从远程 PostgreSQL 数据库中同一表中的另一列中提取的数值改变新列
- ssl - 使用 ECDH 密钥的 Indy TLS 服务器“无共享密码”
- android - 如何从 Firebase android kotlin 获取所有具有特定价值的孩子?