3

我在颤振中使用 just_audio 来播放音频文件。一切都很可爱,除了 just_audio 使用文件扩展名来确定文件类型。因此,如果您的 URL 没有以适当的几个字符结尾,那么您将无法播放该文件。通过阅读 GitHub 上的问题,似乎有一种方法可以回避这个问题(#86#87),但恐怕我不明白答案。

有人可以指出我播放此类 URL 的简单方法吗?

复制问题的方法:

  1. 从just_audio下载示例项目
  2. 将其中一个 URI 替换为https://www.dropbox.com/s/egtn3aavqggpdj2/Bible_ResurrectionLife.mp3%3Fdl=1
  3. 当您尝试播放音频文件时,您应该会看到以下错误:
flutter: An error occured (-11800) The operation could not be completed
[VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: PlatformException(-11800, The operation could not be completed, null, null)
4

1 回答 1

2

您链接到的第一个 GitHub 问题不适用于您的案例,因为它涉及专门在 Android 上检测 HLS 或 Dash 流。iOS 和 Android 上的 MP3 文件不是由文件扩展名决定的,而是由 HTTP 标头决定的。

在 iOS 检测音频文件内容类型的情况下,文件扩展名仅在处理文件时很重要。对于 URL,它Content-Type是 iOS 用来确定音频类型的 HTTP 标头。iOS 还要求服务器必须支持字节范围请求(参见Apple 的解释)。

Dropbox 很可能未能满足其中一项要求。

想到了两个解决方案:

  1. 在能够支持 iOS 所需标头的服务器上托管 MP3 文件。

  2. 您可以尝试使用 just_audio's LockCachingAudioSource。这是为了在同时播放和下载音频时缓存音频。尽管您可能对该功能不感兴趣,但它的实现方式是在 iOS 媒体播放器和服务器之间插入代理。代理以支持字节范围请求的方式实现,尽管在缓存完全下载文件之前,它不一定能够满足文件末尾的字节范围请求。由于它是您的 mp3 文件,您可以尝试以针对流式传输优化的方式对 mp3 文件进行编码,以便 iOS 无需跳转到文件末尾来查找元数据。自实施以来LockCachingAudioSource可以作为开源项目的一部分使用,如果您不需要它,您也可以制作自己的版本来取出缓存部分。

于 2021-02-21T13:20:31.673 回答