如何在 just_audio 扩展后流式传输带有额外信息的 mp3 文件

How to stream mp3 file with extra info after extension in just_audio

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

有人能告诉我一个简单的方法来玩这样的 URL 吗?

重现问题的方法:

  1. just_audio
  2. 下载示例项目
  3. 将其中一个 URI 替换为 https://www.dropbox.com/s/egtn3aavqggpdj2/Bible_ResurrectionLife.mp3%3Fdl=1
  4. 当您尝试播放音频文件时,您应该看到以下错误:
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)

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

在iOS对音频文件内容类型的检测中,只有在处理文件时文件扩展名才是重要的。对于 URL,它是 iOS 用来确定音频类型的 Content-Type HTTP header。 iOS 还要求服务器必须支持字节范围请求(参见 Apple's explanation)。

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

想到了两个解决方案:

  1. 在能够支持 iOS 要求的 header 的服务器上托管 MP3 文件。

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