Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Программы Обои   Экспорт RSS E-Books
 
Поиск по сайту

 

  Раздел: Компьютерная документация -> Интернет технологии -> PHP

 

Объединение нескольких файлов .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
/* При использовании этого скрипта подразумевается, что наши звуковые 
файлы .wav имеют имена от a to z and 1 to 10 и находятся в папке 
captcha_wav в той же директории, где и этот php-файл. Переменная с 
кодом безопасности будет генерироваться для каждой сессии и содержать 
некую строку, которая и будет сверяться с данным, которые ввел пользователь */



$SecurityCode = "beb9";
$localCode = str_split(strtolower($SecurityCode)); // занесем нашу строку captcha 
в локальный массив и переведем в нижний регистр
$wav_array = array(); // этот массив нам пригодится для хранения имен звуковых файлов

foreach($localCode as $character){ // для каждого символа в строке капчи мы 
подберем соответствующий ему звуковой файл - типа 1.wav или c.wav
array_push($wav_array, $character.".wav");
}


header('Content-Type: audio/x-wav'); // заголовок для указания типа файла (аудио)
$content = joinwavs($wav_array); //  вызов функции joinwavs для соединения файлов
echo $content; // вывод бинарного содержимого нового файла


function joinwavs($wavs){
   $data = ''; // бинарный блок аудио-данных
   $tsize = 0; // начальный размер файла

   foreach($wavs as $wav){

       $fp     = fopen("captcha_wav/".$wav,'rb'); // открываем wave-файл

       $header = fread($fp,50); 
/* !!!!!!!!!! ВАЖНО !!!!!!!! Online документация говорит о том,
что заголовочная информация должна быть длиной 40 бит
до непосредственного данных файла. Но на практике оказалось
лучше использвать 50, так что поиграйтесь с этим параметром.
*/

       // чтение SubChunk2ID
       $wordata = fread($fp,4); // для проверки корректности чтения заголовка можно вывести 
	                            //на echo эту переменную. В случае получения слова "data" все идет ок.

   $header .= $wordata; // добавим слово "data" в заголовок
       
       // чтение Subchunk2Size
       $originalBytes=fread($fp, 4);  // 4 битовое поле, которое идет далее      
    
       $size  = unpack('Vsize',$originalBytes);  // числовое значение размера данных

   $tsize  += $size['size']; // суммируем размер
       
   
       // считываем данные, которые остались в файле
       $data .= fread($fp,100000);

   // закрываем data input stream
   fclose($fp);
   }
   
   return $header.pack('V',$tsize).$data;

}

?>

От вас потребуется отправить объединенный файл пользователю с заголовком audio/x-wav, чтобы браузер знал, что это звуковой файл.

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

Автор: Николай Рудченко
Источник: codeguru.com.ua

Ссылки по теме
Внутренние функции
Обработка строк в РНР
PHP и всё такое...
Пишем PHP код, устойчивый к ошибкам
Полезные скрипты на PHP
Почтовые функции в РНР
Полезные функции для работы с файловой системой

Вся документация PHP

 

Компьютерная документация от А до Я - Главная

 
клик | рытье разработка Котлована
 
Интересное в сети
10 новых программ
CodeLobster PHP Edition 3.7.2
WinToFlash 0.7.0008
Free Video to Flash Converter 4.7.24
Total Commander v7.55
aTunes 2.0.1
Process Explorer v12.04
Backup42 v3.0
Predator 2.0.1
FastStone Image Viewer 4.1
Process Lasso 3.70.4
FastStone Image Viewer 4.0
Xion Audio Player 1.0.125
Notepad GNU v.2.2.8.7.7
K-Lite Codec Pack 5.3.0 Full

Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
Реклама на сайте. Размещая рекламу у нас, вы получите новых посетителей, которые могут стать вашими клиентами.
 
Это интересно
 

Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100