8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

使用 JS 和 AudioContext 在 Safari 中播放声音的问题

dsi 2月前

13 0

我的游戏有背景音乐和单独的声音,我以不同的方式播放它们。问题是循环播放的背景音乐在某个时刻会消失,一些声音播放时会出现缺陷。以下是一些...

我的游戏有背景音乐和单独的声音,我以不同的方式播放它们。问题是循环播放的背景音乐在某个时刻会消失,一些声音播放有缺陷。

以下是执行这些功能的 JS 代码

const allSounds   = []
let allSoundsName = [
    //names of sounds
]


function preloadSounds() {
    allSoundsName.forEach(soundName => {
        let audio = new Audio(`./assets/audio/${soundName}.mp3`)

        allSounds.push({
            name: soundName,
            audio: audio,
        })
    })
}

function playAudio({
                       audioName,
                       isLoop,
                       startTime = 0,
                       endTime = null,
                       volume = 1,
                       delay = 0,
                       decrease = 0,
                       duration,
                   }) {
    if (!audioCtx) {
        audioCtx               = new (window.AudioContext || window.webkitAudioContext)();
        audioCtx.onstatechange = () => {
            if (audioCtx.state === 'suspended') {
                console.log('suspended')
                audioCtx.resume();
            }
        };
        addAllSoundGain()
    }
    let sound = getSound(audioName)

    setVolume(sound, off ? 0 : volume)
    if (volume !== 1) addVolumes(audioName, volume)

    sound.audio.currentTime = startTime

    if (endTime) {
        setTime(sound.audio, startTime, endTime, isLoop)

    } else if (isLoop) {
        setLoop(sound.audio, startTime)
    }

    setTimeout(() => {
        sound.audio.play()
        setDurationAndDecrease(sound.audio, audioName, duration, decrease)

    }, delay)

    return sound.audio
}
function addAllSoundGain() {
    allSounds.forEach(sound => {
        let source   = audioCtx.createMediaElementSource(sound.audio);
        let gainNode = audioCtx.createGain();
        source.connect(gainNode);
        gainNode.connect(audioCtx.destination);
        sound.source   = source
        sound.gainNode = gainNode
    })
}
function setDurationAndDecrease(audio, audioName, duration, decrease) {
    if (duration) setTimeout(() => pauseAudio({audioName, decrease}), duration)
}

function setLoop(audio, startTime) {
    audio.onended = () => {
        audio.currentTime = startTime
        audio.play()
    }
}

function setTime(audio, startTime, endTime, isLoop) {
    audio.ontimeupdate = () => {

        if (audio.currentTime >= endTime && isLoop) {
            audio.currentTime = startTime
        } else if (audio.currentTime >= endTime) {
            audio.pause()
        }
    }

}

我不知道该怎么办,因为 Chrome 中一切都很好,这个问题只发生在 Safari Mac 中

帖子版权声明 1、本帖标题:使用 JS 和 AudioContext 在 Safari 中播放声音的问题
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由dsi在本站《html》版块原创发布, 转载请注明出处!
最新回复 (0)
返回
作者最近主题: