我正在使用cordova-plugin-nativeaudio在应用程序中播放音频。当我尝试使用iOS设备预加载文件时:
preload('testsound', cordova.file.dataDirectory + "audio/0/Hello.mp3");
我收到的错误是:
错误:未处理的承诺拒绝:( NATIVE AUDIO)未找到资产。 (file:/// var / mobile / Containers / Data / Application /“[GUID] /Library/NoCloud/audio/0/Hello.mp3); Zone :;任务:setTimeout;值:(NATIVE AUDIO)未找到资产。(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")
控制台输出显示它已成功存储:
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文档中声明。
我在模拟器和iOS设备上都遇到了同样的错误。
有没有人遇到同样的问题,并设法解决它?
谢谢你的帮助。 BR /
在iOS中,如果您需要在序列或转换过程中同步播放声音,那么对我来说唯一有用的是Native Audio preloadComplex和my / 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
});
});
});
如果声音可以异步播放并且是用户录制的,那么对我来说唯一有用的就是Media Plugin。
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();
}
}
我找到了一个解决方法,即使用Media plugin而不是Native音频来播放mp3文件。
虽然Media插件似乎有同样的问题 - 你无法访问带有iOS的cordova.file.dataDirectory,并且在this Jira中讨论过 - 至少有一个解决方法,即使用.toInternalURL()。
toInternalURL:返回表单文件中的路径:/// persistent / path / to / entry(Firefox,IE)。 Chrome以cdvfile:// localhost / persistent / file格式返回路径。
cordova.file.dataDirectory(file:/// var / mobile / Containers / Data / Application / [GUID] / Library / NoCloud)的internalURL是“cdvfile:// localhost / library-nosync /”
所以通过替换:
storageDirectory = cordova.file.dataDirectory;
有:
storageDirectory = "cdvfile://localhost/library-nosync/"
现在媒体插件可以加载和播放下载并存储在带有iOS设备的cordova.file.dataDirectory中的mp3文件。
audioMedia = new MediaPlugin(storageDirectory + "test.mp3");
audioMedia.play();
P.S.1截至2017年6月,这是一个有效的解决方案。
P.2.2我曾尝试将internalURL与Native Audio一起使用,但是没有用。