html 如何在Next.js中后台播放音频?

lxkprmvk  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(174)

我有一个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))
    }}
/>

我的问题是:我怎样才能在后台播放音频,尽管页面被重新加载或离开?

pqwbnv8z

pqwbnv8z1#

我找到的解决方案是使用next.js创建一个布局,请参阅文档。
https://nextjs.org/docs/basic-features/layouts
然后在布局是由所有的应用程序共享。我注入所有我需要在一个模板共享音频。(不示例化新的音频()在useRef)。
这个模板被放在一个useMemo中,因为DOM的这个部分不会一直刷新,所以歌曲可以在所有的页面上显示。
最后,在组件中使用selector作为HTMLAudioElement(类型脚本类型),并使用目标音频id,然后在useEffect()或事件处理函数中播放()它。
请注意,使用useMemo模板将显示和收费的所有源音频链接在浏览器的DOM,在另一方面,它的准备使用的浏览器。

相关问题