Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Проблема с созданием wav файла через php

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
yesnoms
Отправлено: 11 Февраля, 2011 - 17:11:03
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




Всем привет. Прошу помощи в данном вопросе. В общем есть база данных MS SQL в которой хранится шестнадцатиричный код wav записи (система для записи звонков). Сейчас пришло задание написать программу, которая будет давать возможность создавать wav файлы с записью этого звонка.

Делаю я все таким образом. Отправляю через пхп запрос на сервер, который достает мне звонок по его номеру и генерит хтмл ссылку на скачивание этого звонка.
Результат запроса имеет такую структуру
айди звонка | время звонка | имя файла.wav | шестнадцатиричный код |
Сам звонок создается тоже довольно просто:

Из сделанного запроса поиска по номеру берется его байтовый код и записывается через fopen в файл и подсовывается ссылке в хтмл морде. Все вроде бы хорошо, запись проигрывается, но она урезанная, т.е. в переменную передается не весь байт-код, а обрезанный на каком то этапе. почему так происходит не пойму. Какой может быть максимальный размер переменной? потому что сейчас мой скрипт не справляется со звонками даже в 500кб, что очень неприемливо. У кого какие идеи?

собственно вот пример самого цикла который и создает wav

PHP:
скопировать код в буфер обмена
  1.         while($rows = mssql_fetch_assoc($query)) {
  2.                 $call = 'calls/sound.wav';
  3.                 echo "<tr>
  4.                                 <td id='name'><a href='?listen&id=".$rows['ImageFileName']."'>Слушать</a></td>
  5.                                 <td id='user'>".$rows['AgentName']."</td>
  6.                                 <td id='date'>".$rows['CallStartTimeStamp']."</td>
  7.                           </tr>";
  8.                 $f = fopen($call, "w");
  9.                 fwrite($f, $rows['Image']);
  10.                 fclose($f);
  11.         }

(Отредактировано автором: 11 Февраля, 2011 - 17:12:57)

 
 Top
Okula
Отправлено: 11 Февраля, 2011 - 18:52:31
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




yesnoms, если в базе находится бинарный код то тогда и файл нужно создавать для записи этого бинарного кода:

И ещё: какой тип поля имеет строка шестнадцатиричный код в базе данных MySQL?
 
 Top
yesnoms
Отправлено: 11 Февраля, 2011 - 19:09:51
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




Okula пишет:
yesnoms, если в базе находится бинарный код то тогда и файл нужно создавать для записи этого бинарного кода:

И ещё: какой тип поля имеет строка шестнадцатиричный код в базе данных MySQL?


спасибо что напомнил про wb, совсем забыл, правда это не помогло.
В базе код хранится в формате IMAGE.
Потестил разные звонки. Максимальная длительность воспроизведения достигает 39 секунд.
Такое ощущение что данные усекаются при переборе через mssql_fetch_assoc в самом массиве.
Думал, что слишком большие данные шлются, посмотрел php.ini
memory_limit стоит в 128MB, а memory_get_usage() выдает порядка 140кб всего-то

п.с. БД не MySQL а Microsoft SQL Server 2008

p.p.s
копипасть с мелкософта

image

Этот тип представляет двоичные данные переменной длины, включающие от 0 до 2^31 – 1 (2 147 483 647) байт.

(Отредактировано автором: 11 Февраля, 2011 - 19:14:50)

 
 Top
Okula
Отправлено: 11 Февраля, 2011 - 19:31:52
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




yesnoms, с Microsoft SQL Server 2008 я не работал, так что не могу сказаь ничего о нём. Хммм...
 
 Top
Tmin10
Отправлено: 11 Февраля, 2011 - 19:38:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 239
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




а если не писать в файл, а сразу, передав заголовки, отдать браузеру? Тоже обрежет?
 
 Top
Мелкий Супермодератор
Отправлено: 11 Февраля, 2011 - 19:47:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




yesnoms, лучше храните файлы отдельно от БД. Просто используйте вместо реального имени файла id соответствующей ему записи в базе. И база не мучается с огромным размером таблицы и ваша проблема решена.


-----
PostgreSQL DBA
 
 Top
Tmin10
Отправлено: 11 Февраля, 2011 - 19:50:04
Post Id



Частый гость


Покинул форум
Сообщений всего: 239
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Мелкий, это актуально для нового проекта, а как я понял у ТС уже есть реальная система, которую изменить нельзя и он пишет к ней интерфейс.

(Отредактировано автором: 11 Февраля, 2011 - 20:01:01)

 
 Top
yesnoms
Отправлено: 11 Февраля, 2011 - 19:58:48
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




да, есть уже готовая VoIP система, исходники которой не изменяются.
с хидерами подробнее, пожалуйста
 
 Top
Tmin10
Отправлено: 11 Февраля, 2011 - 20:03:03
Post Id



Частый гость


Покинул форум
Сообщений всего: 239
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Я могу ошибаться, но вот:
header("Content-type: audio/wav"); и дальше вывести бинарные данные из базы.
У юзера будет диалог открытия файла.
 
 Top
yesnoms
Отправлено: 11 Февраля, 2011 - 20:15:02
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




сделал так

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once 'classes/mssql.php';
  3. header("Content-type: audio/wav");
  4.  
  5.  
  6.         $query = mssql_query("тут запрос на выборку номера");
  7.                                
  8.         echo $rows['image'];
  9. ?>


предложило открыть файл с wav, но сам файл не воспроизвелся. медиа плеер написал ошибку, т.е. в таком случае даже не проигрывается

(Отредактировано автором: 11 Февраля, 2011 - 20:15:56)

 
 Top
Tmin10
Отправлено: 11 Февраля, 2011 - 20:18:46
Post Id



Частый гость


Покинул форум
Сообщений всего: 239
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




При сохранении файл нулевой получается?

а
заполняется точно?)

(Отредактировано автором: 11 Февраля, 2011 - 20:20:18)

 
 Top
yesnoms
Отправлено: 11 Февраля, 2011 - 20:30:01
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




ох как я тупонул.
8 часов без передышки над одним скриптом.

в общем сделал так, чтобы выводил. выводит wav файл, заполняет, но снова же максимум 39 секунд.
слушаю этот же звонок через программу от производителя системы, длительность 4 минуты, размер звонка 500кб.

вообще может массив хранить такого размера данные?
потому что строка выглядит приблизительно так

Спойлер (Отобразить)
 
 Top
Tmin10
Отправлено: 11 Февраля, 2011 - 20:46:12
Post Id



Частый гость


Покинул форум
Сообщений всего: 239
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




Так проблема была в особой кодировке wav?
 
 Top
Мелкий Супермодератор
Отправлено: 11 Февраля, 2011 - 20:48:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Не, эта строка - примерно 15кб. Без малого 30тыс символов, каждый кодирует 4 бита.

При этом, это проблема не php, т.к. на php я сам обрабатывал строки, представляющие собой 16-ричное кодирование 3-4мб файлов.


-----
PostgreSQL DBA
 
 Top
yesnoms
Отправлено: 11 Февраля, 2011 - 20:59:02
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Февр. 2011  


Помог: 0 раз(а)




Мелкий пишет:
Не, эта строка - примерно 15кб. Без малого 30тыс символов, каждый кодирует 4 бита.

При этом, это проблема не php, т.к. на php я сам обрабатывал строки, представляющие собой 16-ричное кодирование 3-4мб файлов.


ну и проблема точно не в БД, т.к. система очень дорогая + ко всему в программе от производителя все работает отлично.
а работает она по схожему принципу.

во время разговора поток передается в один процесс, который кодирует этот звук в двоичный код и записывает в БД, а когда слушаем звонок, то он таким же образом достается из БД и заливается в файл. просто где-то урезается сам image.

При сохранении моим скриптом получаю 63кб, при сохранении через программу разработчика на выходе 530кб

(Отредактировано автором: 11 Февраля, 2011 - 20:59:48)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB