Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将mp3文件打包到mp4容器中?_Javascript_Ffmpeg_Safari_Mp3_Mp4 - Fatal编程技术网

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

Javascript 如何将mp3文件打包到mp4容器中?,javascript,ffmpeg,safari,mp3,mp4,Javascript,Ffmpeg,Safari,Mp3,Mp4,这就是我目前面临的问题。我需要一个可以播放mp3的iOS音频播放器。现在乍一看,这似乎是一个微不足道的问题,只需创建一个audio标记并为其提供mp3文件的URL即可。虽然这在技术上是可行的,但它基本上是不可用的,因为iOS需要在开始播放之前下载整个文件。这导致在尝试播放大型mp3文件时等待时间非常长(可能接近一分钟)。 所以我尝试的第一件事是手动模拟chrome播放mp3文件时的分块。我首先发送了一个HEAD请求来获取音频文件的字节长度。使用该长度/持续时间(以秒为单位)获得平均每秒字节数,并

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

因此,这让我想到,Safari不可能要求最终用户在播放之前下载整个mp4文件。所以我拿了一个mp3文件,在一个在线转换器上把它转换成mp4,并测试了我的理论。瞧,成功了。Safari将mp4文件分块传输,等待时间接近0。好的,现在我需要做的就是把mp3文件转换成mp4文件。现在的问题是,我不需要使用我的服务器来转换这些文件。我想把这个昂贵的操作转移给客户。在四处寻找了一段时间后,我找到了一些
wasm
库来实现这一点,太棒了!不。这些
wasm
库非常庞大(24MB),会给我已经很大的bundles文件增加不可接受的数量。这就引出了我的问题。有没有办法让safari认为我的mp3文件是mp4。我已经尝试过的:

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

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

有没有办法“欺骗”safari,使其认为我的mp3文件是 mp4

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

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

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

有没有办法“欺骗”safari,使其认为我的mp3文件是 mp4

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

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


是的,完全正确。但是你必须编写代码,而且代码非常复杂。你可以阅读ISO 14496-12文档来了解mp4文件的结构。ISO 11172-3和ISO 13818-3可以将Mp3解析为可以写入mp4的帧。我上个月做了这件事,我只需要128kbps CBR Mp3实时流就可以了,所以我需要硬编码为了支持这种特定的格式,可以对其进行修改,以专门支持不同的比特率,但可能不支持VBR:/。将其发布在此处,以防任何处理firefox而不使用mediasource扩展播放mp3的人使用它:

我上个月做了这件事,我只需要它来支持128kbps CBR mp3实时流o我硬编码了一些东西来支持这种特定的格式,但是可以修改它来专门支持不同的比特率,但可能不是VBR:/。在这里发布它,以防任何处理firefox而不是使用mediasource扩展名播放mp3的人使用它:

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