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

标签 flutter just-audio

我在 flutter 中使用 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)

最佳答案

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

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

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

我想到了两个解决方案:

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

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

关于flutter - 如何在 just_audio 中扩展后流式传输带有额外信息的 mp3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66292875/

相关文章:

flutter - 如何在 flutter 中设置文本行高?

flutter - 如何使用 just_audio 合并两个音频文件以同时播放?

android - flutter 中just_audio pugin的问题

android - 您的主要 Activity 类 com.ryanheise.audioservice.AudioServiceActivity 不是 FlutterFragmentActivity 的子类

flutter - 是否可以在 flutter web 中为域添加前缀?

firebase - 使用电子邮件和密码创建帐户时,Flutter + Firebase updateDisplayName

android - Flutter 使用 ProGuard 和 Firebase Auth 构建崩溃

android - 如何在调试时修复 xiaomi/redmi/miui 的 INSTALL_PARSE_FAILED_NO_CERTIFICATES?