我有一个Next.js项目。我有一个音频播放器,但当离开页面或重新加载时,音频停止播放。我如何在后台播放音频?我认为iframe非常适合,但它会询问我想在哪里下载音频。下面是我现在使用的播放器:
const getCurrDuration = (e) => {
const percent = ((e.currentTarget.currentTime / e.currentTarget.duration) * 100).toFixed(2)
const time = e.currentTarget.currentTime
setPercentage(+percent)
setCurrentTime(time.toFixed(2))
}
const play = () => {
const audio = audioRef.current
if (typeof window !== "undefined") {
audio.volume = localStorage.getItem('volume') ? localStorage.getItem('volume') : 1
audio.playbackRate = localStorage.getItem('playbackRate') ? localStorage.getItem('playbackRate') : 1
if (!isPlaying) {
setIsPlaying(true)
audio.play()
}
if (isPlaying) {
setIsPlaying(false)
audio.pause()
}
}
}
const startPlaying = () => {
setIsPlaying(true)
const audio = audioRef.current
if (typeof window !== "undefined") {
audio.volume = localStorage.getItem('volume') ? localStorage.getItem('volume') : 1
audio.playbackRate = localStorage.getItem('playbackRate') ? localStorage.getItem('playbackRate') : 1
}
if (router.query.time !== null && router.query.time > 0) {
const audio = audioRef.current
if (audio) {
audio.currentTime = router.query.time
setPercentage(router.query.time)
setCurrentTime(router.query.time)
setTimeIsFromUrl(false)
}
}
}
const stopPlaying = () => {
setIsPlaying(false)
}
const onPlayingCapture = () => {
const audio = audioRef.current
if (currentTime > 2) {
localStorage.setItem(props.audio._id, currentTime)
}
if (props.time > 0 && props.time <= duration) {
audio.currentTime = props.time
props.setTimeToZero()
} else if (props.time > 0 && props.time >= duration) {
audio.currentTime = duration
props.setTimeToZero()
}
}
<audio
autoPlay={true}
id="audio"
onPlay={startPlaying}
ref={audioRef}
onPlayingCapture={onPlayingCapture()}
onPause={() => stopPlaying()}
onTimeUpdate={getCurrDuration}
src={props.audio.filePath}
onLoadedData={(e) => {
setDuration(e.currentTarget.duration.toFixed(2))
}}
/>
我的问题是:我怎样才能在后台播放音频,尽管页面被重新加载或离开?
1条答案
按热度按时间pqwbnv8z1#
我找到的解决方案是使用next.js创建一个布局,请参阅文档。
https://nextjs.org/docs/basic-features/layouts
然后在布局是由所有的应用程序共享。我注入所有我需要在一个模板共享音频。(不示例化新的音频()在useRef)。
这个模板被放在一个useMemo中,因为DOM的这个部分不会一直刷新,所以歌曲可以在所有的页面上显示。
最后,在组件中使用selector作为HTMLAudioElement(类型脚本类型),并使用目标音频id,然后在useEffect()或事件处理函数中播放()它。
请注意,使用useMemo模板将显示和收费的所有源音频链接在浏览器的DOM,在另一方面,它的准备使用的浏览器。