【问题标题】:React-Native Audio won't play on IOS Simulator (OSStatus error 2003334207)React-Native Audio 无法在 IOS 模拟器上播放(OSStatus 错误 2003334207)
【发布时间】:2019-06-07 00:13:23
【问题描述】:

我正在 MacBook 上运行 React-Native 应用程序。该应用程序以前适用于 Android。我基本上已经用最新的 react-native 模块重新启动了一个项目。但是,我似乎无法让音频正常工作。

我有以下功能,在点击事件时触发:

  playSound(soundfile) {
        var s = new Sound(RNFS.DocumentDirectoryPath + '/audio/' + soundfile, Sound.MAIN_BUNDLE, (e) => {
      if (e) {
        console.log('error', e);
      } else {
          console.log('duration', s.getDuration());
        s.play(()=>{
                s.release()
                console.log("Sound Resource Released")
         })
      }
    });

  }

我已验证声音文件确实存在并且路径正确。但是,上面的代码抛出了一个错误:

{code: "ENSOSSTATUSERRORDOMAIN2003334207", message: "操作 无法完成。 (OSStatus 错误 2003334207。)”,nativeStackIOS: 数组(17),域:“NSOSStatusErrorDomain”,用户信息:{…}}

这个错误到底告诉我什么,我能做些什么来解决它?

更新说明:

声音文件不是静态声音文件,因此未与应用程序打包。相反,用户可以选择从游戏服务器下载的压缩游戏包。游戏包由图像、音频和数据文件组成。 zip 文件已下载并解压缩。图像和数据文件都可以正常工作。但是,无论出于何种原因,音频都无法播放。我再次确认音频文件确实存在于该路径中。

这是错误的 nativeStackIOS 部分:

0: "0 App4 0x0000000106ee30b7 RCTJSErrorFromCodeMessageAndNSError + 135"
1: "1 App4 0x0000000106ee2fe3 RCTJSErrorFromNSError + 275"App4
2: "2 App4 0x00000001070fdff8 -[RNSound prepare:withKey:withOptions:withCallback:] + 1624"
3: "3 CoreFoundation  0x0000000109ac303c __invoking___ + 140"
4: "4 CoreFoundation  0x0000000109ac04d5 -[NSInvocation invoke] + 325"
5: "5 CoreFoundation  0x0000000109ac0926 -[NSInvocation invokeWithTarget:] + 54"
6: "6 App4 0x0000000106e724ca -[RCTModuleMethod invokeWithBridge:module:arguments:] + 2810"
7: "7 App4 0x0000000106f2e306 _ZN8facebook5reactL11invokeInnerEP9RCTBridgeP13RCTModuleDatajRKN5folly7dynamicE + 790"
8: "8 App4 0x0000000106f2de1f _ZZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEiENK3$_0clEv + 127"
9: "9 App4 0x0000000106f2dd99 ___ZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEi_block_invoke + 25"
10: "10  libdispatch.dylib 0x000000010d0ac4e1 _dispatch_call_block_and_release + 12"
11: "11  libdispatch.dylib 0x000000010d0ad54b _dispatch_client_callout + 8"
12: "12  libdispatch.dylib 0x000000010d0b401c _dispatch_lane_serial_drain + 720"
13: "13  libdispatch.dylib 0x000000010d0b4b5f _dispatch_lane_invoke + 401"
14: "14  libdispatch.dylib 0x000000010d0bd9a8 _dispatch_workloop_worker_thread + 645"
15: "15  libsystem_pthread.dylib 0x000000010d49760b _pthread_wqthread + 409"
16: "16  libsystem_pthread.dylib 0x000000010d497405 start_wqthread + 13"

【问题讨论】:

  • 您是否已将NSAllowsArbitraryLoads 添加到您的info.plist 文件中?
  • @MohammadRF 我不确定这是否是问题所在。 zip 文件已成功下载并解压缩。该 zip 文件中的所有其他内容都可以访问,只是音频无法访问。 NSAllowsArbitraryLoads 是否与能否下载文件有关?

标签: ios react-native


【解决方案1】:

当您尝试访问指定文件夹中不存在或无法从网络下载的文件时会发生此错误。

请使用本地音频文件或建议将托管音频文件的域列入白名单或使用NSAllowsArbitraryLoads将所有内容列入白名单(如果需要)进行测试。

【讨论】:

  • 我不确定这是否是问题所在。 zip 文件已成功下载并解压缩。该 zip 文件中的所有其他内容都可以访问,只是音频无法访问。 NSAllowsArbitraryLoads 是否与能否下载文件有关?
  • 是的,你是对的,也许检查音频文件是否正确解压缩并且音频格式是否可播放..
  • 音频文件在 Android 上运行良好。图像和数据文件也在 IOS 上被正确提取。
【解决方案2】:

根据我发现的一些documentation(我不确定在哪里可以找到官方文档)它说构造函数的语法如下:

constructor(filename, basePath, onError)

其中 basePath 是文件的可选基本路径。 basePath 的选项有:

如果文件名是绝对路径,则忽略它或传递一个空字符串。否则,你 可以使用预定义目录之一:Sound.MAIN_BUNDLE, Sound.DOCUMENT、Sound.LIBRARY、Sound.CACHES。

由于我使用的是绝对路径,因此我将Sound.MAIN_BUNDLE 替换为空字符串。

所以我改变了:

var s = new Sound(RNFS.DocumentDirectoryPath + '/audio/' + soundfile, Sound.MAIN_BUNDLE, (e) => { ... }

到:

var s = new Sound(RNFS.DocumentDirectoryPath + '/audio/' + soundfile, '', (e) => { ... }

现在一切正常。然而,我的一个问题是,为什么它在指定绝对路径和 Sound.MAIN_BUNDLE 时在 Android 上工作得很好,但在 IOS 上却不工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多