ffmpeg - 如何连接两个非常不同的 mp3 文件(差异比特率、通道、采样率、bitdeph)?
问题描述
作为输入,我得到一个 mp3 文件(input.mp3),然后我需要将它分成两个单独的部分(完成)并在这些部分之间插入另一个 mp3(second.mp3)。
问题:我尝试使用每个命令来连接文件,将它们转换为 .ts 等。但我总是只听到第一个 mp3 文件的声音,而第二个文件的声音丢失了。我想我必须将我的 mp3 文件转换为与 input.mp3(比特率,采样率通道数)文件完全相同的格式,然后才能将其连接到它。
我可以连接 input.mp3 的两个部分,但无论我做什么,我都无法与 second.mp3 连接。
我正在使用带有 exec 和 ffmpeg.exe 文件的 php。是否可以对其进行编码,因此无论输入如何,我都可以将 second.mp3 转换为适合连接 mp3 的?
解决方案
如何连接两个非常不同的 mp3 文件(差异比特率、通道、采样率、bitdeph)?
让我们从每个组件开始......
比特率
这个无所谓。MP3 流可以(并且确实!)在流中改变比特率。只要您加入帧头,就可以了。
位深度
MP3 中不存在采样位深度的概念。您可以以 24 位捕获,编码为 MP3,解码器将解码为 16 位。(或者,使用某些命令行开关,反之亦然!)这不是问题,因为位深度不适用。
采样率
这通常是一个问题。大多数玩家并不认为他们会在中途改变输出采样率。大多数玩家不会尝试重新采样以保持他们已经输出的速率。改变采样率会遇到一些麻烦,我并不感到惊讶。
渠道
这类似于采样率问题,因为它需要更改输出设备的配置。即使玩家支持它,它也不会是无缝的。(除非您从立体声转为单声道,否则单声道可以轻松上混为立体声。)
作为输入,我得到一个 mp3 文件(input.mp3),然后我需要将它分成两个单独的部分(完成)并在这些部分之间插入另一个 mp3(second.mp3)。
这实际上提出了另一个你没有问过的问题......时间。MP3 在相对较大的帧(通常为 576 个样本)中工作,这成为您可以拼接的分辨率。不好。此外,轨道的开头通常有一两帧初始化。
第三个问题是位储存器。这是一个框架中的内容存储在可能有额外空间的不同框架中的地方。
归根结底,您将不得不将所有内容解码为常规 PCM 样本,进行拼接,然后重新编码为 MP3。您还必须将所有内容重新采样到一个共同的时钟速率,并混合到一个特定的通道数。幸运的是,一旦解码为 PCM,这一切都是微不足道和标准的。一旦您的输入流兼容,您就可以在 PCM 帧上任意拼接,这是最细粒度的。
推荐阅读
- python - Python 3.x 中 __getattr__ 特殊方法破坏 inspect.getmembers() 的解决方法
- java - 调用某些方法时如何忽略键盘上的按键?
- windows - 使用 NSIS 写入注册表项失败
- java - 如何在休眠中创建相关子查询
- c++ - 如何使用 CFileDialog 获取包含非 ascii 字符的文件路径
- python - 类型错误:__call__() 缺少 1 个必需的位置参数:“输入”
- regex - 从perl中的字符串中提取子字符串
- azure - Cosmos DB - 是否有自动增量字段的方法?
- android - 如何在编辑文本中添加人高,例如(5'11)
- javascript - YouTube Api 仅在硬重新加载时触发