Объединение нескольких файлов .wav с помощью PHPВ этой статье мы рассмотрим интересное применение языку программирования PHP. В данном случае мы напишем функцию, с помощью которой можно объединить несколько звуковых файлов в один. Где это может пригодиться? Да в той же CAPTCHA, к примеру. Ведь иногда, если пользователь не может распознать символов, которые изображены на сгенерированной картинке, ему предлагают прослушать их. И в данном случае вовсе не нужно использовать специальные синтезаторы типа текст -> звук, ведь в латинице только 26 букв + 10 цифр. Но нам потребуется соединить произношение каждого символа как говорится "на лету". Вот, собственно, и сама функция: function joinwavs($wavs){ $fields = join('/',array( 'H8ChunkID', 'VChunkSize', 'H8Format', 'H8Subchunk1ID', 'VSubchunk1Size', 'vAudioFormat', 'vNumChannels', 'VSampleRate', 'VByteRate', 'vBlockAlign', 'vBitsPerSample' )); $data = ''; foreach($wavs as $wav){ $fp = fopen($wav,'rb'); $header = fread($fp,36); $info = unpack($fields,$header); // read optional extra stuff if($info['Subchunk1Size'] > 16){ $header .= fread($fp,($info['Subchunk1Size']-16)); } // read SubChunk2ID $header .= fread($fp,4); // read Subchunk2Size $size = unpack('vsize',fread($fp, 4)); $size = $size['size']; // read data $data .= fread($fp,$size); } return $header.pack('V',strlen($data)).$data; } Думаю, разобраться вам будет с нею несложно. Как видите, нам потребуется предварительно извлечь (заголовки) header information нашего звукового файла типа длительности duration, bit rate, audio channel и т.д. Чтобы было понятнее, это делает функция unpack для декодирования файла: <?php $fp = fopen('chord.wav', 'r'); fseek($fp, 20); $rawheader = fread($fp, 16); $header = unpack('vtype/vchannels/Vsamplerate/Vbytespersec/valignment/vbits', $rawheader); print_r($header); ?> Вот что выдаст нам это скрипт после его запуска: Array ( [type] => 1 [channels] => 2 [samplerate] => 22050 [bytespersec] => 88200 [alignment] => 4 [bits] => 16 ) Вот полный листинг кода с комментариями: <?php /* При использовании этого скрипта подразумевается, что наши звуковые файлы От вас потребуется отправить объединенный файл пользователю с заголовком audio/x-wav, чтобы браузер знал, что это звуковой файл. Также нужны будут сами аудио-файлы для каждого символа. Думаю, их в инете масса и найти их не составит большого труда. Да и можете сами записать. |