合并两个mp3 php

时间:2010-10-21 21:55:51

标签: php http merge mp3 ogg

您是否知道使用PHP合并两个MP3文件的类?

我在谷歌上找不到任何东西。

5 个答案:

答案 0 :(得分:10)

如果通过合并,你的意思是将一个音频放在另一个音频上,那么请忽略这个答案。

如果您不想重新编码MP3,可以直接添加它们。我知道这适用于MPEG电影,所以我想它也适用于MP3。另一种选择是将音频文件添加到没有压缩的Zip存档,然后将扩展名重命名为.mp3。

我做了一个快速测试,这个

file_put_contents('combined.mp3',
    file_get_contents('file1.mp3') .
    file_get_contents('file2.mp3'));

工作得很好。 ID3标签是错误的,但生成的文件包含两个音频文件。 For some other possible gotchas, see the link in Pekka's answer

此外,一些快速的谷歌搜索导致了

和一些讨论

答案 1 :(得分:2)

这是不可能的。 PHP中没有MP3编解码器的实现。您需要使用外部命令行工具来执行此操作。 (根据您的服务器配置,您可以在PHP中执行,如@ceejayoz所说。)

有关解决方案,请参阅以下问题:

答案 2 :(得分:2)

如果.mp3文件只是MPEG-1或MPEG-2 Layer III音频,那么文件就可以连接起来。整个文件没有标头的真正概念。每个帧都有一个标题后跟数据,文件只包含一系列帧,称为比特流。比特率,立体声模式等在比特流中不一定必须相同,因此您可以连接不同的文件。维基百科的文章解释了这一点,但我认为规范实际上更容易理解。

文件中的ID3标签或其他数据(从技术上讲,它是一种不合规的比特流)可能会破坏解码器端的内容。

MPEG-1和MPEG-2音频的规格实际上非常简单。编写解析器将文件分块为帧,然后解释头文件并不是那么多。我最后一次这样做,只花了一两个小时。

ID3规范也没那么复杂,所以我怀疑编写一些代码来删除标记,然后连接应该很容易,但我从来没有这样做过。

getID3()库(http://getid3.sourceforge.net/)也可能提供一些指导。我使用它已经有一段时间了,但它也可能支持打开MP3并剥离ID3标签。

HTH

答案 3 :(得分:0)

要记住的重要事项:

  • 比特率必须匹配。确保速率(Hz)和立体声/单声道匹配(我使用Audacity)也是一个好主意。
  • Content-length标题是两个文件的长度。

这是我的文字转语音项目的样本。我需要在动态生成的MP3音频结尾处添加1秒的静音:

$output_audio = textToMP3("Hello World");               // Original audio
$silent_audio = file_get_contents("silence.mp3");       // 1 second silence
$content_length = strlen($output_audio) + strlen($silent_audio);

// Output the audio stream
header('Content-type: audio/mpeg');
header('Content-length: ' . $content_length);
header('Cache-Control: no-cache');
header("Pragma: no-cache");
header("Expires: 0");
echo $audio . $silent_audio;

答案 4 :(得分:0)

对于现在有兴趣做同样事情的人,您可以使用以下库: https://github.com/falahati/PHP-MP3

composer require falahati/php-mp3

合并两个MP3文件:

$audio1 = \falahati\PHPMP3\MpegAudio::fromFile("1.mp3");
$audio2 = \falahati\PHPMP3\MpegAudio::fromFile("2.mp3");
$audio1->append($audio2)->saveFile("3.mp3");