让 React useEffect 检查视频 link 是否有可用的视频
Making React useEffect check whether video link has video available
我遇到了一个困难。我正在开发自定义视频播放器,我正在尝试使用 useEffect 检查视频源是否有视频(它打开 link,但从未启动)。这是 link 和视频 http://media.xiph.org/mango/tears_of_steel_1080p.webm
我想做的是检查视频是否可以加载 5 秒,如果不能 - 将 isLoaded 状态更改为 false,阻止控件,如果 5 秒内没有解决 - 重定向到错误路径(或 console.log 例如)。如果一切正常并且一切都已加载 - 将 isLoaded 更改为 true 并在视频可用后立即开始播放。
我可以检查videoRef的current.duration是否不等于0或current.networkState,但我不知道如何检查它5秒,如果一切正常就开始。
这是我的代码:
const PlayerScreen = (props) => {
const [isPlaying, setIsPlaying] = useState(false);
const [isLoaded, setIsLoaded] = useState(false);
const videoRef = useRef(null);
useEffect(() => {
const video = videoRef.current;
video.oncanplay = () => {
setIsPlaying(true);
video.play();
};
video.onplay = () => {
setIsPlaying(true);
};
video.onpause = () => {
setIsPlaying(false);
};
video.ontimeupdate = () => {
if (video.currentTime !== 0) {
handleTimeElapsed();
handleProgress();
}
};
return () => {
video.oncanplaythrough = null;
video.onplay = null;
video.onpause = null;
video.ontimeupdate = null;
};
}, []);
const {
film: {
previewImg,
videoSrc
},
} = props;
return (
<div className="player">
<video
className="player__video"
ref={videoRef}
src={videoSrc} // http://media.xiph.org/mango/tears_of_steel_1080p.webm
poster={previewImg}
/>
</div>)
}
希望能帮到你。谢谢!
我做了一些测试,看看如果视频不可用,您可以如何处理您的状态
在你的 useEffect 中发出请求,看看是否有网络错误,并设置超时以避免获取时间无限。
React.useEffect(() => {
(async () => {
try {
const result = await Axios.get(
"http://media.xiph.org/mango/tears_of_steel_1080p.webm",
{ timeout: 5000}
);
// Do something here
} catch (e) {
console.log("The link is not avaible", e.message);
// Do something here
}
})();
}, []);
如果你的 fetch 没有错误,useEffect 不会捕获错误,你可以编写你的代码
我遇到了一个困难。我正在开发自定义视频播放器,我正在尝试使用 useEffect 检查视频源是否有视频(它打开 link,但从未启动)。这是 link 和视频 http://media.xiph.org/mango/tears_of_steel_1080p.webm
我想做的是检查视频是否可以加载 5 秒,如果不能 - 将 isLoaded 状态更改为 false,阻止控件,如果 5 秒内没有解决 - 重定向到错误路径(或 console.log 例如)。如果一切正常并且一切都已加载 - 将 isLoaded 更改为 true 并在视频可用后立即开始播放。
我可以检查videoRef的current.duration是否不等于0或current.networkState,但我不知道如何检查它5秒,如果一切正常就开始。
这是我的代码:
const PlayerScreen = (props) => {
const [isPlaying, setIsPlaying] = useState(false);
const [isLoaded, setIsLoaded] = useState(false);
const videoRef = useRef(null);
useEffect(() => {
const video = videoRef.current;
video.oncanplay = () => {
setIsPlaying(true);
video.play();
};
video.onplay = () => {
setIsPlaying(true);
};
video.onpause = () => {
setIsPlaying(false);
};
video.ontimeupdate = () => {
if (video.currentTime !== 0) {
handleTimeElapsed();
handleProgress();
}
};
return () => {
video.oncanplaythrough = null;
video.onplay = null;
video.onpause = null;
video.ontimeupdate = null;
};
}, []);
const {
film: {
previewImg,
videoSrc
},
} = props;
return (
<div className="player">
<video
className="player__video"
ref={videoRef}
src={videoSrc} // http://media.xiph.org/mango/tears_of_steel_1080p.webm
poster={previewImg}
/>
</div>)
}
希望能帮到你。谢谢!
我做了一些测试,看看如果视频不可用,您可以如何处理您的状态
在你的 useEffect 中发出请求,看看是否有网络错误,并设置超时以避免获取时间无限。
React.useEffect(() => {
(async () => {
try {
const result = await Axios.get(
"http://media.xiph.org/mango/tears_of_steel_1080p.webm",
{ timeout: 5000}
);
// Do something here
} catch (e) {
console.log("The link is not avaible", e.message);
// Do something here
}
})();
}, []);
如果你的 fetch 没有错误,useEffect 不会捕获错误,你可以编写你的代码