[ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ]



Ответов: 0
25-02-12 07:01







   Web - программирование
PHP


ASP






XML



CSS

SSI





   Программирование под ОС











   Web - технологии








   Базы Данных









   Графика






Данные




Web - программирование / 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




Комментарии

 Ваш комментарий к данному материалу будет интересен нам и нашим читателям!



Последние статьи: Web - программирование / PHP /

GTK+: перспективы развития
02-03-2010   

Библиотека GTK+ прошла долгий путь развития и сейчас очень популярна. GNOME, одна из ведущих оконных сред, использует GTK+ почти исключительно, GIMP построен на GTK+, множество коммерческих разработчиков ПО, таких как Abobe, NVidia и VMware, решили использовать эту библиотеку в качестве графической основы для своих продуктов... подробнее

Кол. просмотров: общее - 4676 сегодня - 1

Новостной портал
13-11-2009   

Slashdot.org – популярный новостной портал с посещаемостью 50 млн. человек в месяц. Авторы проекта добились такого успеха, предоставляя пользователям свежие и интересные новости из мира IT... подробнее

Кол. просмотров: общее - 4605 сегодня - 0

Параллельное выполнение скриптов может нарушить целостность информации в файлах
13-11-2009   

Здесь рассматривается вопрос, что бывает, если запустить некий скрипт почти одновременно (что происходит, например, при большой нагруженности сервера) несколько раз, т.е. запустить несколько копий одного и того же скрипта. И к чему это может привести... подробнее

Кол. просмотров: общее - 4402 сегодня - 2

No spam.php
10-11-2009   

...и снова о спаме. Кто о нем только не писал, и все писали, что это плохо и ай-яй-яй. Я не буду оригинальничать, и тоже скажу – это плохо. Это ай-яй-яй. Как бороться со спамерами со своей стороны... подробнее

Кол. просмотров: общее - 4445 сегодня - 0

Начинаем работу с рисунками в php для Windows
10-11-2009   

Эта статья даст вам общее представление о том, как создавать, обрабатывать и выводить рисунки в PHP4 для Windows... подробнее

Кол. просмотров: общее - 4437 сегодня - 0



  WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects