如何解决如何在 just_audio 中扩展后流式传输带有额外信息的 mp3 文件
我在 Flutter 中使用 just_audio 来播放音频文件。一切都很可爱,只是 just_audio 使用文件扩展名来确定文件类型。因此,如果您的 URL 没有以适当的几个字符结尾,那么您将无法播放该文件。通过阅读 GitHub 上的问题,似乎有办法回避这个问题(#86 和 #87),但恐怕我不明白答案。
有人能告诉我一种播放这种 URL 的简单方法吗?
重现问题的方法:
- 从 just_audio 下载示例项目
- 将其中一个 URI 替换为 https://www.dropbox.com/s/egtn3aavqggpdj2/Bible_ResurrectionLife.mp3%3Fdl=1
- 当您尝试播放音频文件时,您应该看到以下错误:
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 很可能没有满足其中一项要求。
想到两个解决方案:
-
在能够支持 iOS 所需标头的服务器上托管 MP3 文件。
-
您可以尝试使用 just_audio 的
LockCachingAudioSource
。这是为了在同时播放和下载音频时缓存音频。尽管您可能对该功能不感兴趣,但它的实现方式是在 iOS 媒体播放器和服务器之间插入代理。代理以支持字节范围请求的方式实现,尽管在缓存完全下载文件之前,它不一定能够满足文件末尾的字节范围请求。由于它是您的 mp3 文件,您可以尝试以针对流媒体进行优化的方式对 mp3 文件进行编码,这样 iOS 就不需要跳到文件末尾来查找元数据。由于LockCachingAudioSource
的实现是开源项目的一部分,如果您不需要它,您也可以制作自己的版本,去掉缓存部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。