javascript - 我该如何将 mp3 文件打包到 mp4 容器中?

标签 javascript ffmpeg safari mp3 mp4

这就是我目前遇到的问题。我需要一个可以播放 mp3 的 iOS 音频播放器。乍一看,这似乎是一个微不足道的问题,只需创建一个 audio 标记并为其提供 mp3 文件的 URL。虽然这在技术上可行,但它基本上无法使用,因为 iOS 需要在开始播放之前下载整个文件。这会导致尝试播放大型 mp3 文件时等待时间非常长(可能接近一分钟)。 所以我尝试的第一件事就是手动模仿 chrome 播放 mp3 文件时的分块。我首先发送了一个 HEAD 请求来获取音频文件的字节长度。使用该长度/持续时间(以秒为单位)来获取每秒的平均字节数,并使用该数据根据用户寻求的位置来请求 block 。但这不起作用,因为有时 mp3 文件包含会导致计算失败的元数据(例如封面图像)。此外,有时 mp3 文件使用 VBR(可变比特率),然后我就彻底搞砸了。

所以这让我想到,Safari 不可能要求最终用户在播放之前下载整个 mp4 文件。所以我拿了一个 mp3 文件,在在线转换器上将其转换为 mp4,并测试了我的理论。瞧,它成功了。 Safari 正在以 block 的形式传输 mp4 文件,等待时间接近 0。好吧,现在我需要做的就是将 mp3 文件转换为 mp4 文件。现在的问题是,我要求不要使用我的服务器来转换这些文件。我想将这个昂贵的操作卸载给客户端。环顾四周后,我发现了一些 wasm 库可以做到这一点,太棒了!没有。这些 wasm 库非常巨大(24 MB),会给我已经很大的捆绑文件添加 Not Acceptable 数量。这让我想到了我的问题。有什么方法可以“欺骗” safari 认为我的 mp3 文件是 mp4。我已经尝试过:

在输入更改事件时 -> 获取文件 -> 将其克隆到 mimeType 为 video/mp4 的新 Blob 中,然后将该文件上传到服务器。 Chrome 可以正常播放该文件(可能是因为它检测到它是 mp3 文件),但在 Safari 上却无法播放该文件。

所以我的问题是,有没有办法将 mp3 文件打包到 mp4 容器中(客户端!重要),以“强制”Safari 对文件进行分块。

最佳答案

Is there any way to "trick" safari into thinking that my mp3 file is mp4

mp4 文件不可查找,因为客户端“认为”它们是 mp4。他们在文件中有一个索引,这是搜索工作所需的。该索引并没有神奇地存在,因为 mime 类型已更改。

is there any way to package the mp3 file in an mp4 container (Client Side...

是的,完全可以。但是你必须写代码,而且非常复杂。您可以阅读 ISO 14496-12 文档来了解 mp4 文件的结构。 ISO 11172-3 和 ISO 13818-3 将 Mp3 解析为可写入 MP4 的帧

关于javascript - 我该如何将 mp3 文件打包到 mp4 容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365432/

相关文章:

JavaScript Safari - 语法错误 : Unexpected token '>'

angularjs - Safari 开发人员工具在尝试检查元素时不断崩溃

javascript - 我似乎无法将 Jquery 应用到我的 Microsoft Visual Studio

javascript - 使用javascript(客户端)将来自两个不同视频的两个片段组合成一个视频?

php - FFMpeg 合并音频和视频文件

ruby-on-rails - 用于视频上传的 Heroku ffmpeg 构建包

Chrome/Safari for Mac 中的 Jquery Cycle 问题或 css 问题

javascript - 如果总是以不同/随机名称返回,如何绑定(bind)到 json key ?

javascript - 继承自2个对象

javascript - Date.toJSON() 和 Date.toISOString() 之间的区别