http://www.theblog.ca/merge-mp3s-php
One of the new features of my anti-spam plugin is the ability to create auto-generated mp3 files. The plugin concatenates individual mp3 files representing the sound of each letter in the alphabet, in order to build a word.
Of course, I have no idea how to code something that merges mp3 files, so I had to do some searching and eventually found this site with some working code: http://www.sourcerally.net/Scripts/20-PHP-MP3-Class.
Here is my modified version, with some simplified functionality (I removed the code that added ID3 tags) and an added feature that I modified from FPDF (a script that creates PDFs in PHP) in order to output (to the browser) the merged mp3 file, prompting users to open or save it. This code is compatible with both PHP 4 and PHP 5.
<?php // This is the class to generate mp3 files based on the anti-spam words // Based on the PHP mp3 class at http://www.sourcerally.net/Scripts/20-PHP-MP3-Class // Output code based on the FPDF class at http://www.fpdf.org class mp3 { var $str; var $time; var $frames; // Create a new mp3 function mp3($path="") { if($path!="") { $this->str = file_get_contents($path); } } // Put an mp3 behind the first mp3 function mergeBehind($mp3) { $this->str .= $mp3->str; } // Calculate where's the end of the sound file function getIdvEnd() { $strlen = strlen($this->str); $str = substr($this->str,($strlen-128)); $str1 = substr($str,0,3); if(strtolower($str1) == strtolower('TAG')) { return $str; } else { return false; } } // Calculate where's the beginning of the sound file function getStart() { $strlen = strlen($this->str); for($i=0;$i<$strlen;$i++) { $v = substr($this->str,$i,1); $value = ord($v); if($value == 255) { return $i; } } } // Remove the ID3 tags function striptags() { //Remove start stuff... $newStr = ''; $s = $start = $this->getStart(); if($s===false) { return false; } else { $this->str = substr($this->str,$start); } //Remove end tag stuff $end = $this->getIdvEnd(); if($end!==false) { $this->str = substr($this->str,0,(strlen($this->str)-129)); } } // Display an error function error($msg) { //Fatal error die('<strong>audio file error: </strong>'.$msg); } // Send the new mp3 to the browser function output($path) { //Output mp3 //Send to standard output if(ob_get_contents()) $this->error('Some data has already been output, can\'t send mp3 file'); if(php_sapi_name()!='cli') { //We send to a browser header('Content-Type: audio/mpeg3'); if(headers_sent()) $this->error('Some data has already been output to browser, can\'t send mp3 file'); header('Content-Length: '.strlen($this->str)); header('Content-Disposition: attachment; filename="'.$path.'"'); } echo $this->str; return ''; } } ?>
Here’s how I used the class to generate an mp3 file from individual files (in a “sounds” folder) representing each letter. You can, of course, use the above code to concatenate mp3 files for any purpose.
// Specify the word $petersword = "testword"; $word_count = strlen($petersword); // Set up the first file if ($word_count > 0) { $mp3 = new mp3($cas_fontpath . 'sounds/' . substr($petersword, 0, 1) . '.mp3'); $mp3->striptags(); } // Generate the mp3 file from each letter in the word for ($i = 1; $i < $word_count; ++$i) { $cas_character = $cas_fontpath . 'sounds/' . substr($petersword, $i, 1); $cas_mp3equivalent = new mp3($cas_character . '.mp3'); $mp3->mergeBehind($cas_mp3equivalent); $mp3->striptags(); } // Spit out the audio file! $mp3->output('word.mp3');
Note: if you need some support using any of the code, I suggest that you visit the original source of the mp3 concatenation code.