【问题标题】:How would I go about packaging an mp3 file into an mp4 container?我将如何将 mp3 文件打包到 mp4 容器中?
【发布时间】: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


    【解决方案1】:

    有什么方法可以“欺骗”Safari 让我认为我的 mp3 文件是 mp4

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

    有没有办法将 mp3 文件打包到 mp4 容器中(客户端...

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

    【讨论】:

    • 跟进问题。因此,如果我要在十六进制编辑器中打开一个 mp3 文件和一个 mp4 文件(通过将 mp3 转换为 mp4 创建的),大概我会找到 mp4 文件中包含的 mp3 二进制数据?
    • 新问题应该有新帖子。但是,是的,您会看到 mp3 数据。帧可能保持连续,也可能不保持连续,但这取决于打包程序。
    • 澄清一下,包含在 mp4 文件中的 mp3 文件可以是连续的,并且仍然可以作为 mp4 播放?这意味着如果我在某个 mp4 文件需要音轨的地方编写自己的打包程序,我可以插入原始 mp3 二进制数据?
    • 有点,是的。在展开答案之前,您需要了解 mp4 容器和 mp3 基本格式。因为没有这些知识,您将无法完全理解答案。
    【解决方案2】:

    我上个月做了这件事,我只需要它用于 128kbps CBR mp3 实时流,所以我硬编码了一些东西来支持该特定格式,它可以修改为专门支持不同的比特率,但可能不是 VBR: /。在这里发布它以防万一任何处理 Firefox 不使用媒体源扩展播放 mp3 的人使用:https://gist.github.com/fanfare/0fa525af28b275fd6623942d7e9d70dd

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多