Ionic 2 / iOS - 本机音频在cordova.file.dataDirectory 中找不到文件

Nan*_*ako 5 audio cordova ionic-framework ionic2 ionic3

我正在使用 cordova-plugin-nativeaudio 在应用程序中播放音频。当我尝试使用 iOS 设备预加载文件时:

preload('testsound', cordova.file.dataDirectory + "audio/0/Hello.mp3");
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:未处理的承诺拒绝:(NATIVE AUDIO)未找到资产。(file:///var/mobile/Containers/Data/Application/"[GUID]/Library/NoCloud/audio/0/Hello.mp3) ; Zone: ; Task: setTimeout ; Value: (NATIVE AUDIO) Asset not found . (file:///var/mobile/Containers/Data/Application/[GUID]/Library/NoCloud/audio/0/Hello.mp3)

目标文件

目标文件(audio/0/Hello.mp3)从外部url下载并存储在cordova.file.dataDirectory中。它已成功下载,如下控制台输出:

下载完成:file:///var/mobile/Containers/Data/Application/[GUID]/Library/NoCloud/audio/0/Hello.mp3

为了确保它确实存储在预期位置,我检查了:

this.file.checkFile(cordova.file.dataDirectory, "audio/0/Hello.mp3")
Run Code Online (Sandbox Code Playgroud)

控制台输出显示它已成功存储:

file:///var/mobile/Containers/Data/Application/[GUID]/Library/NoCloud/audio/0/Hello.mp3 文件确实存在!

现在我尝试使用本机音频预加载文件,出现上述错误(此问题中的第一个错误)。

问题似乎是文件的存储位置

我还尝试从本地 applicationDirectory (/www/assets/audio/0/Hello.mp3) 预加载,预加载工作正常。但是 applicationDirectory 是只读目录,所以我无法从外部 url 下载音频并将它们保存在那里。

本机音频应该支持从 url(不仅是从本地 applicationDirectory)预加载,因为它在他们的 Ionic API 文档中有所说明。

preload 函数的 API 文档截图

我在模拟器和 iOS 设备上都遇到了同样的错误。

有没有人遇到过同样的问题,并设法解决它?

谢谢你的帮助。BR/

小智 3

在 iOS 中,如果您需要作为序列或过渡的一部分同步播放声音,唯一对我有用的是 Native Audio preloadComplex 以及我的 /asset 中的文件。

import { NativeAudio } from '@ionic-native/native-audio';

...

let id = new Date().toISOString();
this.nativeAudio.preloadComplex(id, 'assets/file.m4a', 1, 1, 0).then(() => {
  this.nativeAudio.play(id, () => {
    this.nativeAudio.unload(id).then(() => {
      // Next step
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

如果声音可以异步播放并且是用户录制的,那么唯一对我有用的是媒体插件。

import { Media, MediaObject } from '@ionic-native/media';

...

if (this.mediaObject) {
  this.mediaObject.release();
}      
this.mediaObject = this.media.create('../Library/NoCloud/MediaFiles/file.m4a');
this.mediaObject.play();

...

ionViewDidLeave() {
  if (this.mediaObject) {
    this.mediaObject.release();
  }
}
Run Code Online (Sandbox Code Playgroud)