构建安卓原生应用 AudioEngine播放音频 画面闪烁卡死

用CocosCreator构建安卓游戏,Android Studio,NDK,SDK等都为最新,在安卓7.1,8.1,4.4,5.1真机上测试都出现该现象,100%发生,之后写了个简单的Demo来测试,依然崩溃。目前无法得到调试信息
我是这么调用的:

  1. 给脚本添加一个cc.AudioClip的变量
  2. 在编辑器中拖动音频文件到该变量
  3. 在脚本onLoad函数中调用cc.AudioEngine.playMusic
  4. 在windows,web mobile测试都不会发生该现象,正常运行,控制台没有errors
  5. 构建出apk后安装到真机上,出现该现象

Cocos Creator版本:2.3.0
Android版本:真机7.1/8.1/4.4/5.1 模拟器:4.4/5.1

提供下demo,没能复现你说的情况~

Simulator: E/jswrapper (604): jsb: ERROR: File f:\jenkins\workspace\creator_2d\cocos2d-x-lite\windows\cocos2d-x-lite\cocos\scripting\js-bindings\auto\jsb_cocos2dx_audioengine_auto.cpp: Line: 604, Function: js_audioengine_AudioEngine_stop
E/jswrapper (604): js_audioengine_AudioEngine_stop : Error processing argumentsE/jswrapper (611): [ERROR] Failed to invoke js_audioengine_AudioEngine_stop, location: f:\jenkins\workspace\creator_2d\cocos2d-x-lite\windows\cocos2d-x-lite\cocos\scripting\js-bindings\auto\jsb_cocos2dx_audioengine_auto.cpp:611
at HTMLElement.print-simulator-log (D:\CocosCreator_2.3.1\resources\app.asar\editor\builtin\scene\panel\messages\scene.js:1:1608)
at Object.e._dispatch (D:\CocosCreator_2.3.1\resources\app.asar\editor-framework\lib\renderer\panel.js:1:1876)
at EventEmitter. (D:\CocosCreator_2.3.1\resources\app.asar\editor-framework\lib\renderer\ipc.js:1:2952)
at EventEmitter.emit (events.js:194:13)
at EventEmitter.emit (domain.js:469:20)
at EventEmitter.topLevelDomainCallback (domain.js:124:23)

在creatorv.2.3.1中,脚本中调用cc.audioEngine.play(clip, bLoop, volume) 模拟器运行会报错,程序继续执行,放到真机上就画面闪烁卡死
并且我构建原生包,选了debug模式,调试连接不上,没有看到出错信息

注释掉 cc.audioEngine.play(clip, bLoop, volume)调用后,在真机上可以正常跑起来

看下报错的位置,应该是 cc.AudioEngine.stop 参数传错了, 打印下是传了什么值。

stop 传入null 会导致报错吗?

模拟器报错是因为stop传入了null
但是真机上的卡死和画面闪还是因为调用了 cc.audioEngine.play 导致
同样的代码在PC平台和微信小游戏平台是可以正常跑的

修复报错,再测试看看,如果还有问题,可以提供下demo。

播放音乐我做了一个简单的封装

public PlayMusic(strMusicName:string,bLoop:boolean,volume:number) : void
{
    this.m_musicVolume = volume;
    if(this.m_bMusicMute)
    {
        volume = 0;
    }
    if(strMusicName=="")
    {
        return;
    }
    if(this.m_music>=0)
    {
        this.StopMusic();
    }
    console.log("播放Music:",strMusicName);
    let self = this;
    cc.loader.loadRes(strMusicName, cc.AudioClip, function (err, clip)
        {
            console.log("加载Music完成:",strMusicName);
            if(err)
            {
                console.log("加载声音失败 %s",err.message);
            }
            else
            {
                self.m_music = cc.audioEngine.play(clip, bLoop, volume);
            }
            console.log("播放Music完成:",strMusicName);
        }
    );
}

我使用同样的方法,在helloworld示例中试了 能够正常播放音乐,没有报错!
游戏中调用PlayMusic的地方,是窗体组件的onEnable中调用的,我在helloworld示例中也试了在一个窗体组件onEnable中调用,也是可以正常播放音乐!

但是在游戏中,调用PlayMusic,报错如下:

04-02 15:06:36.412 7636-7673/cn.kxgamer.dog D/jswrapper: JS: 加载Music完成: sound/sound_bgm
04-02 15:06:36.412 7636-7673/cn.kxgamer.dog E/jswrapper: ERROR: Uncaught ReferenceError: HTMLAudioElement is not defined, location: src/cocos2d-jsb.js:0:0
STACK:
[0]9.t._unbindEnded@src/cocos2d-jsb.js:2769
[1]set@src/cocos2d-jsb.js:2892
[2]play@src/cocos2d-jsb.js:3109
[3]anonymous@src/project.js:159
[4]anonymous@src/cocos2d-jsb.js:15290
[5]anonymous@src/cocos2d-jsb.js:15184
[6]anonymous@src/cocos2d-jsb.js:21055
[7]fireTimeout@jsb-adapter/jsb-builtin.js:2191
[8]tick@jsb-adapter/jsb-builtin.js:2148
04-02 15:06:36.412 7636-7673/cn.kxgamer.dog E/jswrapper: [ERROR] (D:/CocosCreator_2.3.1/resources/cocos2d-x/cocos/scripting/js-bindings/jswrapper/v8/Object.cpp, 562): Invoking function (0x5584c55420) failed!
04-02 15:06:36.412 7636-7673/cn.kxgamer.dog D/jswrapper: JS: 加载Music完成: sound/sound_bgm
04-02 15:06:36.422 7636-7673/cn.kxgamer.dog E/jswrapper: ERROR: Uncaught ReferenceError: HTMLAudioElement is not defined, location: src/cocos2d-jsb.js:0:0
STACK:
[0]9.t._unbindEnded@src/cocos2d-jsb.js:2769
[1]set@src/cocos2d-jsb.js:2892
[2]play@src/cocos2d-jsb.js:3109
[3]anonymous@src/project.js:159
[4]anonymous@src/cocos2d-jsb.js:15290
[5]anonymous@src/cocos2d-jsb.js:15184
[6]anonymous@src/cocos2d-jsb.js:21055
[7]fireTimeout@jsb-adapter/jsb-builtin.js:2191
[8]tick@jsb-adapter/jsb-builtin.js:2148
04-02 15:06:36.422 7636-7673/cn.kxgamer.dog E/jswrapper: [ERROR] (D:/CocosCreator_2.3.1/resources/cocos2d-x/cocos/scripting/js-bindings/jswrapper/v8/Object.cpp, 562): Invoking function (0x5584c55420) failed!
04-02 15:06:36.462 7636-7673/cn.kxgamer.dog D/jswrapper: JS: 加载Music完成: sound/sound_bgm

从错误日志来看,明显是cc.loader.loadRes的回调在执行cc.audioEngine.play的时候出错了

另外说下,游戏在浏览器预览、微信小游戏平台以及模拟器中都可以正常跑,就是打包apk后,在真机上跑会出错!
不方便提供完整游戏工程包以供引擎组调试,不好意思!

HTMLAudioElement 没有定义,但是这个引擎初始化就有的,是不是被串改了,或者启动流程不对?
可以使用chrome调试跟踪看看。
https://docs.cocos.com/creator/manual/zh/publish/debug-jsb.html#真机调试

我之前试了debug模式,老是连不上 我今天再试试!
另外,我还有个疑问,为什么在真机上就不行了呢?

播放时出错,说明如下:

Audio._element在构造的时候就是赋值为null

之后也没有再赋值,返回之后使用时,在下面的函数中报错

另外,对比两个不同的工程,使用同样的播放代码,一个是helloworld工程能够正常播放,一个是游戏不能正常播放

正常播放:

不能正常播放:

两者调用的函数都不一样,望引擎组看看!

官方大大,我升级到2.3.2,打包app还是有很多白块问题啊,不是这个版本修复了么? 急。

我也遇到这个问题,屏幕闪烁

用的2.3.3正式版,跟你一样的问题啊,请问大佬解决了吗

引擎组的大佬们,打原生包,播放声音会出错 这个问题准备怎么解决?有时间表吗?

引擎组的大佬们,打原生包,播放声音会出错 这个问题准备怎么解决?有时间表吗?

作者求修复

引擎组的大佬们,打原生包,播放声音会出错 这个问题准备怎么解决?有时间表吗?

音频是有些问题,请提供下复现的 demo,从你提供的调试信息是没法定位代码如何运行到错误位置。:14:

引擎组的大佬们,打原生包,播放声音会出错 这个问题准备怎么解决?有时间表吗?