目录

ios-webgl音频问题

目录

ios webgl音频问题

问题描述:

使用audiosource播放音频。一个audiosource播放背景音;一个audiosource播放音效;一个audiosource播放语气

在android上没有问题。

但是在ios上遇到问题,声音一卡一卡的。

做了几个尝试:

  1. 使用audiocontext播放,但是ios上丝毫未改变啥。而且在android上还报错。

  2. 使用audio,在android上播放正常,ios不能不正常。

  3. 使用wx.createinneraudiocontext,android正常,ios上直接卡死。

jslib的代码如下:


mergeInto(LibraryManager.library, {
    CallJS: function ()
    {
        GameGlobal.TestCStoJS();
    },

    OpenMobuleGame: function ()
    {
        GameGlobal.nfo.OpenMobuleGame();
    },

    // 播放背景音乐
    PlayBGMByJs: function (srcPtr) {
        var src = UTF8ToString(srcPtr);

        if (!window._bgmAudio) {
            window._bgmAudio = new Audio(src);
        } else {
            // 如果切换不同的背景音,替换 src
            if (window._bgmAudio.src.indexOf(src) === -1) {
                window._bgmAudio.pause();
                window._bgmAudio = null;
                window._bgmAudio = new Audio(src);
            }
        }

        window._bgmAudio.loop = true;
        var playPromise = window._bgmAudio.play();
        if (playPromise !== undefined) {
            playPromise.catch(function (err) {
                console.warn("PlayBGM failed:", err);
            });
        }

    },

    // 停止背景音乐
    StopBGMByJs: function () {
        if (!window._bgmAudio) return;
        window._bgmAudio.pause();
        window._bgmAudio.currentTime = 0;
    },
     
    //刷新数据到IndexedDB
    SyncDB: function () {
        FS.syncfs(false, function (err) {
           if (err) console.log("syncfs error: " + err);
        });
    },

    // 初始化 AudioContext(用户交互后调用)
    AudioContext_Unlock: function() {
        if (!window._audioCtx) {
            window._audioCtx = new (window.AudioContext || window.webkitAudioContext)();
        }

        if (window._audioCtx.state === 'suspended') {
            window._audioCtx.resume().then(function() {
                console.log("AudioContext 已解锁");
            });
        }
    },

    // 播放音频:传入路径字符串(UTF8指针)
    AudioContext_Play: function(urlPtr) {
        var url = UTF8ToString(urlPtr);
        if (!window._audioCtx) {
            const AudioCtx = window.AudioContext || window.webkitAudioContext;
            window._audioCtx = new AudioCtx();
        }

        // 停止之前的音频
        if (window._bgmSource) {
            window._bgmSource.stop();
            window._bgmSource.disconnect();
            window._bgmSource = null;
        }

        fetch(url)
            .then(function(res) { return res.arrayBuffer(); })
            .then(function(arrayBuffer) { return window._audioCtx.decodeAudioData(arrayBuffer); })
            .then(function(audioBuffer) {
                var source = window._audioCtx.createBufferSource();
                source.buffer = audioBuffer;
                source.loop = true;
                source.connect(window._audioCtx.destination);
                source.start(0);
                window._bgmSource = source;
            })
            .catch(function(err) {
                console.error("音频加载或播放失败", err);
            });
    },

    // 停止音频
    AudioContext_Stop: function() {
        if (window._bgmSource) {
            window._bgmSource.stop();
            window._bgmSource.disconnect();
            window._bgmSource = null;
        }
    }
})

不知道有啥好的解决方式。。。。