Слияние двух mp3-плееров

Знаете ли вы класс, чтобы объединить два файла MP3 с помощью PHP?

Я ничего не нашел в Google.

Если путем слияния вы имеете в виду размещение одного звука над другим, то, пожалуйста, не обращайте внимания на этот ответ.

Если вы не хотите перекодировать MP3-файлы, вы можете просто добавить их. Я знаю, что это работало для MPEG-фильмов, поэтому я думаю, что это может работать и для MP3. Другим вариантом было бы добавить аудио-файлы в Zip-архив без сжатия, а затем переименовать расширение в .mp3.

Я сделал быстрый тест, и это

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

работал отлично. Теги ID3 будут неправильными, но полученный файл содержит оба аудиофайла. Для некоторых других возможных перехватов см. Ссылку в ответе Пекки .

Кроме того, некоторые быстрые googling привели к

и некоторые обсуждения

Это невозможно. В PHP отсутствует реализация кодека MP3. Для этого вам понадобится внешний инструмент командной строки. (Который, в зависимости от конфигурации вашего сервера, можно выполнить из PHP, как говорит @ceejayoz.)

См. Эти вопросы для решений:

  • Объединение файлов MP3 в Linux Debian с помощью PHP

  • Каков наилучший способ объединить mp3-файлы?

Если файлы .mp3 являются только аудио MPEG-1 или MPEG-2 Layer III, файлы можно просто конкатенировать. Нет никакой реальной концепции заголовка для всего файла. Каждый кадр имеет заголовок, за которым следуют данные, а файл состоит только из последовательности кадров, которая называется битовым потоком. Битрейт, стереорежим и т. Д. Не обязательно должны быть одинаковыми в битовом потоке, поэтому вы можете объединять разнородные файлы. Статья в Википедии объясняет это, но я думаю, что спецификация на самом деле легче понять.

ID3-теги или другие данные в файле (который технически делает его несоответствующим битовым потоком) могут подавлять события на конце декодера.

Спецификация для аудио MPEG-1 и MPEG-2 на самом деле довольно проста. Написание парсера для фрагмента файла в фреймах, а затем интерпретация заголовков не так уж много работает. В последний раз, когда я это делал, это заняло всего час или два.

Спецификация ID3 тоже не так сложна, поэтому я подозреваю, что написал код, чтобы вырезать теги, прежде чем конкатенация должна быть легкой, но я этого никогда не делал.

Библиотека getID3 () (http://getid3.sourceforge.net/) может также дать некоторые рекомендации. Прошло некоторое время с тех пор, как я использовал его, но он также может поддерживать открытие MP3-файлов и вытеснение тегов ID3.

НТН

Важные вещи для запоминания:

  • Скорости бит должны совпадать. Также неплохо обеспечить соответствие скорости (Гц) и стерео / моно (я использовал Audacity).
  • Заголовок Content-length представляет собой длину обоих файлов.

Вот пример из моего проекта «текст-речь». Мне нужно было добавить 1 секунду молчания в конце MP3-звука, который был сгенерирован динамически:

 $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; 

Для всех, кто сейчас заинтересован в том, чтобы сделать то же самое, вы можете использовать следующую библиотеку: 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");