cocos creater音频播放失败 || 不回调 || 卡死 || 鸿蒙

问题背景

  1. 开发过程中 未发现问题

  2. 线上 部分鸿蒙用户反馈: 页面卡死没反应 || 页面不能继续下一步

  3. so: 问题有可能是 音频没播出来, 或者回调没回来, 或者 获取音频的时长错误

测试现场1

  1. 经过测试的重复复现问题 得到一个现场数据 如下

    2022-08-09 17:10:54.792 21491-21981/com.zuoyebang.bangbangshizi V/AudioEngineImpl: play2d, _audioPlayers.size=0
    2022-08-09 17:10:54.792 21491-21981/com.zuoyebang.bangbangshizi V/AudioPlayerProvider: (@assets/assets/bundle_common/native/5b/5b1f43ed-ff53-42f2-ae62-b8770d2533ad.mp3) file size: 979728
    2022-08-09 17:10:54.792 21491-21981/com.zuoyebang.bangbangshizi V/UrlAudioPlayer: Current UrlAudioPlayer instance count: 1
    2022-08-09 17:10:54.792 21491-21981/com.zuoyebang.bangbangshizi V/UrlAudioPlayer: UrlAudioPlayer::prepare: @assets/assets/bundle_common/native/5b/5b1f43ed-ff53-42f2-ae62-b8770d2533ad.mp3, SL_DATALOCATOR_ANDROIDFD, 147, 190559016, 979728
    2022-08-09 17:10:54.792 21491-21981/com.zuoyebang.bangbangshizi I/AudioSystem: getDeviceConnectionState , Connecting to the Bluetooth device
    2022-08-09 17:10:54.792 21491-21981/com.zuoyebang.bangbangshizi I/IAudioPolicyService: getDeviceConnectionState, BpAudioPolicy: Bluetooth device
    2022-08-09 17:10:54.796 21491-21981/com.zuoyebang.bangbangshizi V/AudioEngineImpl: play2d, _audioPlayers.size=1
    2022-08-09 17:10:54.796 21491-21981/com.zuoyebang.bangbangshizi V/AudioPlayerProvider: (@assets/assets/bundle_common/native/be/be1894f3-7064-4479-94fe-cfaabe1a07c6.mp3) file size: 202477
    2022-08-09 17:10:54.796 21491-21981/com.zuoyebang.bangbangshizi V/UrlAudioPlayer: Current UrlAudioPlayer instance count: 2
    2022-08-09 17:10:54.796 21491-21981/com.zuoyebang.bangbangshizi V/UrlAudioPlayer: UrlAudioPlayer::prepare: @assets/assets/bundle_common/native/be/be1894f3-7064-4479-94fe-cfaabe1a07c6.mp3, SL_DATALOCATOR_ANDROIDFD, 151, 387146732, 202477
    2022-08-09 17:10:54.796 21491-21981/com.zuoyebang.bangbangshizi I/AudioSystem: getDeviceConnectionState , Connecting to the Bluetooth device
    2022-08-09 17:10:54.796 21491-21981/com.zuoyebang.bangbangshizi I/IAudioPolicyService: getDeviceConnectionState, BpAudioPolicy: Bluetooth device
    2022-08-09 17:10:54.880 21491-28436/com.zuoyebang.bangbangshizi E/libOpenSLES: Error after prepare: 1
    2022-08-09 17:10:54.885 21491-28433/com.zuoyebang.bangbangshizi E/libOpenSLES: Error after prepare: 1
    2022-08-09 17:11:01.042 21491-22407/com.zuoyebang.bangbangshizi E/NLog: start or restart send timer, sendInterval=30.
    
  2. 上边的数据可以看到: E/libOpenSLES: Error after prepare: 1

  3. 查找相关资料 : https://www.twblogs.net/a/5c83723dbd9eee35fc13cb3e/?lang=zh-cn

  4. 查阅资料可知:

    (1) E/libOpenSLES(25131): Too many objects
    (2) E/libOpenSLES: Error after prepare: 1第一个, 是SLPlayItf对象没有及时销毁,不同的平台SLPlayItf同时支持的数量不同,大约是2-10左右,所以音频播放完成之后,需要及时销毁。否则,出现(1)的错误,就会播放不出来声音,到一定程度就会导致崩溃。第二个, 是因为播放文件的格式OpenSLES不支持,或是文件有问题,无法正确播放。并且出现这种问题后,会让SLPlayItf的回调函数无法正确执行,最终导致SLPlayItf越来越多,从而出现(1)的情况和结局。那么,解决(1)的问题,就是在音频播放完成后及时销毁,我们可以使用回调来实现,但是(2)的问题又会导致回调不正确。
    
  5. 所以, 现在分析错误原因: 是因为调用关系, 或者别的位置原因 导致音频播放失败

测试现场1 解决方案

  1. 由于 代码中频繁的调用 cc.audioEngine.stopAll

  2. 这个错误 是 io 还挺快的鸿蒙机器上发现的

  3. 怀疑 stopAll 和 play 调用时间不确定。 stop 还未完成 直接调play 导致播放失败

  4. 顺着这个思路 尝试解决的方案 就是

    1. 切换场景 和 切换页面 调用 stopAll 之后 等待 0.1s 在初始化场景
    2. 0.1s 用户感知上 未见明显延迟
    

测试现场2

  1. 测试现场2 是 比较老的 鸿蒙pad 上发现的

    08-08 15:29:06.345   588   806 I APM_AudioPolicyManager: getNewOutputDevice() selected device 2 connectdeDevices(10002)
    08-08 15:29:06.346   588   806 D APM::AudioOutputDescriptor: stop, profile name: primary out,  curActiveCount: 0
    08-08 15:29:06.346 13482 14264 E libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:889: pthread_mutex_lock_timeout_np returned 110
    08-08 15:29:06.346   817   894 I dubaid  : [AudioHandler.cpp] stopSession# Failed to find audio session: 3753
    08-08 15:29:06.354  9599  9893 W ContentSensor_AudioInfoCapture: No need notify, resultList is empty
    08-08 15:29:06.354  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.354  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.372  2494  3160 D nStackXCoAP: ParseServiceDiscover:[416] :new device join
    08-08 15:29:06.372  2494  3160 E nStackXDFinder: DatabaseAllocRecord:[136] :DB max limit exceeded maxcnt:20, usecnt:20
    08-08 15:29:06.372  2494  3160 E nStackXDFinder: CreateNewDevice:[227] :Failed to allocate device info
    08-08 15:29:06.376 13482 14264 E libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:889: pthread_mutex_lock_timeout_np returned 110
    08-08 15:29:06.382  9599  9893 W ContentSensor_AudioInfoCapture: No need notify, resultList is empty
    08-08 15:29:06.382  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.382  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.384  9599  9893 W ContentSensor_AudioInfoCapture: No need notify, resultList is empty
    08-08 15:29:06.384  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.384  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.385  1589  1598 I system_server: Background concurrent copying GC freed 826201(24MB) AllocSpace objects, 3(60KB) LOS objects, 40% free, 34MB/58MB, paused 839us total 209.358ms
    08-08 15:29:06.386 13482 14263 D         : TrackPlayerBase::~TrackPlayerBase()
    08-08 15:29:06.386 13482 14263 D         : PlayerBase::~PlayerBase()
    08-08 15:29:06.387 13482 14263 D         : TrackPlayerBase::~TrackPlayerBase()
    08-08 15:29:06.387 13482 14263 D         : PlayerBase::~PlayerBase()
    08-08 15:29:06.399  9599  9893 W ContentSensor_AudioInfoCapture: No need notify, resultList is empty
    08-08 15:29:06.399  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.399  9599  9893 W ContentSensor_AudioInfoCapture: insert info list is empty
    08-08 15:29:06.416 13482 14264 E libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:889: pthread_mutex_lock_timeout_np returned 110
    08-08 15:29:06.433  1589  1815 I HwFingersSnapshooter: handleMotionEvent first finger(0) touch down at (106.9443,115.90342)
    08-08 15:29:06.467 13482 14264 E libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:889: pthread_mutex_lock_timeout_np returned 110
    
  2. 表现为: 页面不能点击 动画不播放 , 连接V8 调试模式 连接失败

  3. 怀疑 V8 引擎崩溃 或者卡死

  4. 但是 查看上述 log 发现

    libOpenSLES: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:889: pthread_mutex_lock_timeout_np returned 110
    
  5. 所以 最后怀疑: 音频线程死锁,把主线程 卡死

  6. 查找资料: https://developer.aliyun.com/article/580467

  7. 查找资料:https://forum.cocos.org/t/topic/115287 论坛中有人提到:卡死的问题我也遇到过,是短时间内停止、播放音效导致的,上层做下管理,避免这种情况的出现。

  8. 结合 复现机器, io 很慢,

  9. 所以 分析原因: 有可能是 因为io慢, 音频加载的时间变长, 刚播放 就调用 stop ,导致音频线程锁死

测试现场2 解决方案

  1. 由于 代码中频繁的调用 cc.audioEngine.stopAll

  2. 这个错误 是 io 非常慢的鸿蒙机器 发现的

  3. 音频加载的时间变长, 刚播放 就调用 stop ,导致音频线程锁死

  4. 顺着这个思路 尝试解决的方案 就是

    1. 调用 cc.audioEngine.play 之后 0.1s 之内 不允许stopAll
    2. 调用play之前 记录一下 当前时间戳
    3. 调用 stopAll之前 判断 是否 超过记录时间戳的 0.1s  如果不够的话 等待到0.1s 再stop
    记录的代码如下public static initFuncForAudioEngine(){let playFunc = cc.audioEngine.playcc.audioEngine.play = (clip: cc.AudioClip, loop: boolean, volume: number):number=>{AudioUtils._lastTimeSound = new Date().getTime()return playFunc.call(cc.audioEngine, clip, loop, volume)}let playEffectFunc = cc.audioEngine.playEffectcc.audioEngine.playEffect = (clip: cc.AudioClip, loop: boolean):number=>{AudioUtils._lastTimeSound = new Date().getTime()return playEffectFunc.call(cc.audioEngine, clip, loop)}let playMusicFunc = cc.audioEngine.playMusiccc.audioEngine.playMusic = (clip: cc.AudioClip, loop: boolean):number=>{AudioUtils._lastTimeMusic = new Date().getTime()return playMusicFunc.call(cc.audioEngine, clip, loop)}}

cocos creater 鸿蒙 音频卡死 播放失败 不回调相关推荐

  1. 鸿蒙音频低延迟,鸿蒙OS 音频播放开发指导

    场景介绍 音频播放的主要工作是将音频数据转码为可听见的音频模拟信号并通过输出设备进行播放,同时对播放任务进行管理. 接口说明 接口名 描述 AudioRenderer(AudioRendererInf ...

  2. 《直播疑难杂症排查系列》之一 :播放失败

    第一篇文章我们从播放开始,因为观看直播最重要的一个环节就是打开播放器,很多问题的直接反馈也是来自观众端. 导致播放失败的原因有很多种,不一定是播放器本身的问题,不过通过播放器,我们很容易反过来排查服务 ...

  3. 直播疑难杂症排查(1)— 播放失败

    1. 播放失败的表现 播放失败的表现总结下来包括但不限于以下这些: - 界面上一直显示 "加载中",或者提示播放失败的错误 - 播放画面卡死不动,但 UI 按钮可以点击 - 有声音 ...

  4. 『牛角书』鸿蒙开发小小播放器

    鸿蒙开发小应用-音乐播放器 话不多说,展示. 第一次进去会申请访问权限,点击"始终允许" 点击"始终允许"后退出一下,再次点击进入该应用会看到一首音乐Dream ...

  5. 直播APP开发公司、直播源码出售《直播疑难杂症排查系列》之 :播放失败

    播放失败的表现 播放失败的表现总结下来包括但不限于以下这些: 界面上一直显示「加载中」,或者提示播放失败的错误: 播放画面卡死不动,但 UI 按钮可以点击: 有声音没有画面,有画面没有声音. 这里并不 ...

  6. iOS 9音频应用播放音频之ios9音频基本功能

    iOS 9音频应用播放音频之ios9音频基本功能 在iOS 9音频应用开发中最为简单和常用的就是AVFoundation框架中的AVAudioPlayer类.虽然AVAudioPlayer类不能播放网 ...

  7. java实现音频播放小程序_微信小程序实现音频文件播放进度的实例代码

    问题描述 在微信小程序中经常会用到控制文件播放的滑块,通过滑块可控制音频播放进度,下面即用代码实现. 解决方案 首先用.wxml与 .wmss 代码实现进度条的效果,再通过 .js 文件控制进度条的进 ...

  8. 百度网盘:未知错误播放失败1000

    今天打开百度网盘出现这个错误:"百度网盘:未知错误播放失败1000" 方法一(网上搜的): 自己用的是手机和平板打开视频,这样是能正常观看的,所以觉得是由于电脑百度云版本过旧导致的 ...

  9. Audio播放音频 --- 建立播放通道

    Audio播放音频 - 建立播放通道 简介 虽然文章标题是<建立播放通道>,其实播放通道早在AudioPolicyManager解析configuration配置文件时,openoutpu ...

最新文章

  1. 把运维和开发放一起就是DevOps?还差得远!
  2. 聚沙成塔 : 第十六届智能车竞赛规则你一言,我一语
  3. 批量过滤删除AD中的对象
  4. python右对齐格式化输出_Python中格式化输出的两种方法介绍
  5. info testing mysql_SQLMASQLMAP中文说明(linux版本)
  6. 计算机网络技术在教学中的,精选:浅析计算机网络技术在教育教学中的运用原稿...
  7. [Xcode]XcodeGhost问题的检查和验证
  8. 基于springboot毕业设计管理系统设计与实现(带论文)
  9. 高清优质PPT模板20篇下载(金融投资系列)
  10. 有2n个硬币,其中除一个略重外,其余2n-1个都一样重。
  11. perl查看包安装路径
  12. 软件定义边界(SDP)简介
  13. 你不得不看的“互联网+企业购”大趴攻略
  14. kerberos mysql配置_CDH安装之篇四:启用Kerberos认证
  15. manjaro pacman glibc 2.33 not fount
  16. sfc /scannow 提示 插入Windows XP SP3 CD 光盘
  17. 罗克韦尔ABSourceKeyTools工具制作
  18. 麦当劳宣布20年来最大规模收购 提高服务智能化
  19. Android Toast控件
  20. 中软国际:开启数字化转型的缘分天空

热门文章

  1. Debian 11 DNS服务器修改不生效解决方法
  2. 如何利用GPT来发论文!!
  3. Development Tools 错误解决
  4. USACO Monthly Expense
  5. plm显示服务器位置无效,PLM能解决的常见数据管理问题
  6. 蓝桥ROS云课→一键配置←f1tenth和PID绕圈
  7. bit、Byte、bps、Bps、pps单位详解
  8. 2021年数据可视化趋势预测
  9. 你要怎么切你的披萨?
  10. linux mint 18内核版本,Linux Mint 18.2用户如何升级到Linux Mint 18.3“Sylvia”