【发布时间】:2020-02-23 18:26:49
【问题描述】:
这就是我目前遇到的问题。我需要一个可以播放 mp3 的 iOS 音频播放器。现在乍一看这似乎是一个微不足道的问题,只需创建一个audio 标记并将其提供到 mp3 文件的 URL。虽然这在技术上可行,但它基本上无法使用,因为 iOS 需要在开始播放之前下载整个文件。当尝试播放大型 mp3 文件时,这会导致非常长的等待时间(可能接近一分钟)。
所以我尝试的第一件事是手动模仿 chrome 播放 mp3 文件的分块。我首先发送了一个HEAD 请求来获取音频文件的字节长度。使用该长度/持续时间(以秒为单位)来获取每秒的平均字节数,并使用该数据根据用户寻求的位置请求块。这不起作用,因为有时 mp3 文件包含会影响计算的元数据(如封面图像)。此外,有时 mp3 文件使用 VBR(可变比特率),然后我就完全搞砸了。
所以这让我想到,Safari 不可能要求最终用户在播放之前下载整个 mp4 文件。所以我拿了一个 mp3 文件,在在线转换器上将其转换为 mp4 并测试了我的理论。瞧,它奏效了。 Safari 正在分块流式传输 mp4 文件,等待时间接近 0。好吧,现在我需要做的就是将 mp3 文件转换为 mp4 文件。现在的问题是,我要求不要使用我的服务器来转换这些文件。我想把这个昂贵的操作卸载给客户端。环顾四周后,我找到了一些 wasm 库来执行此操作,太棒了!没有。这些wasm 库很大(24 MB),会给我已经很大的捆绑文件增加不可接受的数量。所以这让我想到了我的问题。有什么方法可以“欺骗” safari 认为我的 mp3 文件是 mp4。我已经尝试过的:
在输入更改事件时 -> 获取文件 -> 将其克隆到 mimeType 为 video/mp4 的新 Blob 中,然后将该文件上传到服务器。 Chrome 播放这个文件没有问题(可能是因为它检测到它是一个 mp3 文件),但是在 Safari 上它无法播放这个文件。
所以我的问题是,有没有办法将 mp3 文件打包到 mp4 容器(客户端!重要)中以“强制”Safari 对文件进行分块。
【问题讨论】:
标签: javascript ffmpeg safari mp3 mp4