Объединение нескольких файлов .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, чтобы браузер знал, что это звуковой файл. Также нужны будут сами аудио-файлы для каждого символа. Думаю, их в инете масса и найти их не составит большого труда. Да и можете сами записать. |