微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我在 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 标头决定的。

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

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

想到两个解决方案:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。