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

问题描述 投票:0回答:1

所以这是我目前遇到的问题。我需要iOS的音频播放器,可以播放mp3。现在乍看之下,这似乎是一个琐碎的问题,只需创建一个audio标记并将其指向mp3文件的URL。尽管从技术上讲这是可行的,但由于iOS需要在开始播放之前下载整个文件,因此基本上无法使用。尝试播放大型mp3文件时,这会导致非常长的等待时间(可能接近一分钟)。因此,我尝试的第一件事是手动模仿chrome对播放mp3文件所做的分块。我首先发送了一个HEAD请求,以获取音频文件的字节长度。使用该长度/持续时间(以秒为单位)获取每秒的平均字节数,并根据用户寻求的位置使用该数据请求块。这是行不通的,因为有时mp3文件包含的元数据会影响计算(如封面图片)。此外,有时mp3文件使用VBR(可变比特率),然后我就感觉很不错。

因此,我想到Safari无法要求最终用户在播放文件之前先下载整个mp4文件。因此,我拿了一个mp3文件,通过在线转换器将其转换为mp4,并测试了我的理论。瞧,它奏效了。 Safari正在分流传输mp4文件,等待时间接近于0。好的,所以现在我要做的就是将mp3文件转换为mp4文件。现在的问题是,我要求不要使用服务器来转换这些文件。我想把这个昂贵的操作转移给客户端。在四处寻找之后,我发现了一些wasm库可以做到这一点,太好了!不。这些wasm库很大(24 MB),并且会给我已经很大的bundles文件增加不可接受的数量。因此,这使我想到了我的问题。有什么办法可以“诱骗”野生动物园以为我的mp3文件是mp4。我已经尝试过的内容:

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

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

javascript ffmpeg safari mp3 mp4
1个回答
0
投票

有什么方法可以“诱骗”野生动物园,使我认为我的mp3文件是mp4

mp4文件不可搜索,因为客户端“认为”它们是mp4。它们在文件中具有寻求工作所需的索引。该索引并不存在,因为mime类型已更改。

有什么方法可以将mp3文件打包到mp4容器中(客户端...

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

© www.soinside.com 2019 - 2024. All rights reserved.