【问题标题】:Ionic 2 / iOS - Native audio does not find a file in cordova.file.dataDirectoryIonic 2 / iOS - 本机音频在 cordova.file.dataDirectory 中找不到文件
【发布时间】:2017-11-20 17:44:17
【问题描述】:

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

preload('testsound', cordova.file.dataDirectory + "audio/0/Hello.mp3");

我收到以下错误:

错误:未处理的承诺拒绝:(原生音频)找不到资产。 (file:///var/mobile/Containers/Data/Application/"[GUID]/Library/NoCloud/audio/0/Hello.mp3);区域:;任务: 设置超时;值:(原生音频)未找到资产。 (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/

【问题讨论】:

  • 尝试使用onProgress,有时它显示完整但文件损坏,使用onProgress你可以知道下载了多少字节
  • 谢谢伊佐。我相信该文件已成功下载。因为如果我在 applicationDirectory 中下载(只有模拟器允许这样做,但不能使用设备),我可以预加载和播放音频。无论如何,我都会检查 onProgress,因为确保下载完成似乎很有用。谢谢。 BR/

标签: cordova audio ionic-framework ionic2 ionic3


【解决方案1】:

我找到了一个解决方法,就是使用Media plugin,而不是Native audio来播放mp3文件。

虽然媒体插件似乎也有同样的问题——你无法使用 iOS 访问 cordova.file.dataDirectory,它在this Jira 中进行了讨论——至少有一个解决方法,那就是使用 .toInternalURL ()。

toInternalURL:以file:///persistent/path/to/entry 形式返回路径(Firefox、IE)。 Chrome 返回 cdvfile://localhost/persistent/file 格式的路径。

cordova.file.dataDirectory (file:///var/mobile/Containers/Data/Application/[GUID]/Library/NoCloud) 的内部URL 是“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.S.2 我曾尝试将 internalURL 与 Native Audio 结合使用,但没有成功。

【讨论】:

    【解决方案2】:

    在 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
        });
      });
    });
    

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

    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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多