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 :: Генерация графиков

 PHP.SU

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


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

> Описание: waveform из mp3
maragon
Отправлено: 22 Июля, 2015 - 22:40:16
Post Id



Посетитель


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


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




Уже который день сижу, все никак вкурить не могу.
Скриптик по типу wav2png.

CODE (htmlphp):
скопировать код в буфер обмена
  1. php_flag safe_mode off
  2. define('ROOT_DIR', dirname (__FILE__).'/');
  3. Права на папки стоят


PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class Waveform {
  3. public static function create($audio_file, $user_id, $file_id, $invert = false) {
  4.         ini_set("max_execution_time", "60000");
  5.         define("DETAIL", 2);
  6.         $width = "500";
  7.         $height = "100";
  8.         $color = "#f01256";
  9.         $ROOT = ROOT_DIR;
  10.         $ATTACHS = $ROOT."uploads/".$user_id."/";
  11.         $filename = substr(md5(time()), 0, 20);
  12.         $file = $ATTACHS.$filename;
  13.         copy($ATTACHS.$audio_file, $ATTACHS.$filename."_o.mp3");
  14.         exec($ROOT."/lame ".$ATTACHS.$file."_o.mp3 -f -m m -b 16 --resample 8 ".$ATTACHS.$file.".mp3 && ".$ROOT."/lame --decode ".$ATTACHS.$file.".mp3 ".$ATTACHS.$file.".wav");
  15.         @unlink($file."_o.mp3");
  16.         @unlink($file.".mp3");
  17.         $filename = "{$file}.wav";
  18.         $handle =  fopen($filename, "r");
  19.         $header = array();
  20.         $header[] = fread($handle, 4);
  21.         $header[] = bin2hex(fread($handle, 4));
  22.         $header[] = fread($handle, 4);
  23.         $header[] = fread($handle, 4);
  24.         $header[] = bin2hex(fread($handle, 4));
  25.         $header[] = bin2hex(fread($handle, 2));
  26.         $header[] = bin2hex(fread($handle, 2));
  27.         $header[] = bin2hex(fread($handle, 4));
  28.         $header[] = bin2hex(fread($handle, 4));
  29.         $header[] = bin2hex(fread($handle, 2));
  30.         $header[] = bin2hex(fread($handle, 2));
  31.         $header[] = fread($handle, 4);
  32.         $header[] = bin2hex(fread($handle, 4));
  33.         $bits = hexdec(substr($header[10], 0, 2));
  34.         $byte = $bits / 8;
  35.         $channels = hexdec(substr($header[6], 0, 2));
  36.  
  37.         if ($channels == 2) {
  38.                 $skip = 40;
  39.         }
  40.         else {
  41.                 $skip = 80;
  42.         }
  43.  
  44.         $data = array();
  45.         while (!feof($handle)) {
  46.                 $bytes = array();
  47.                 for ($i = 0; $i < $byte; $i++) {
  48.                         $bytes[$i] = fgetc($handle);
  49.                 }
  50.                 switch ($byte) {
  51.                         case 1:
  52.                                 $data[] = self::getAmplitude($bytes[0], $bytes[1]);
  53.                                 break;
  54.                         case 2:
  55.                                 if (ord($bytes[1]) & 128) {
  56.                                         $temp = 0;
  57.                                 }
  58.                                 else {
  59.                                         $temp = 128;
  60.                                 }
  61.                                 $temp = chr((ord($bytes[1]) & 127) + $temp);
  62.                                 $data[] = floor(self::getAmplitude($bytes[0], $temp) / 256);
  63.                                 break;
  64.                 }
  65.                 fread($handle, $skip);
  66.         }
  67.         fclose($handle);
  68.         @unlink($filename);
  69.         $img = imagecreatetruecolor(sizeof($data) / DETAIL, $height);
  70.         imagealphablending($img, false);
  71.         imagesavealpha($img, true);
  72.         $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
  73.         imagefilledrectangle($img, 0, 0, sizeof($data) / DETAIL, $height, $transparent);
  74.         imagefill($img, 1, 1, $transparent);
  75.         list($r, $g, $b) = self::html2rgb($color);
  76.         $color = imagecolorallocate($img, $r, $g, $b);
  77.         for ($d = 0; $d < sizeof($data); $d += DETAIL) {
  78.         $v = (int) ($data[$d] / 255 * $height);
  79.         $x = $d / DETAIL;
  80.  
  81.         if ($invert) {
  82.                         imageline($img, $x, 0, $x, ($height - $v), $color);
  83.                         imageline($img, $x, $height - ($height - $v), $x, $height, $color);
  84.         } else {
  85.                         imageline($img, $x, 0 + ($height - $v), $x, $height - ($height - $v), $color);
  86.                 }
  87.  
  88.         }
  89.         $rimg = imagecreatetruecolor($width, $height);
  90.         imagealphablending($rimg, false);
  91.         imagesavealpha($rimg, true);
  92.         imagecopyresampled($rimg, $img, 0, 0, 0, 0, $width, $height, sizeof($data) / DETAIL, $height);
  93.         if(imagepng($rimg, $ROOT."/waveforms/".$file_id.".png")){
  94.         return 1;
  95.         } else {
  96.         return 0;
  97.         }
  98. }
  99. private static function getAmplitude($byte1, $byte2) {
  100.         $byte1 = hexdec(bin2hex($byte1));
  101.         $byte2 = hexdec(bin2hex($byte2));
  102.         return ($byte1 + ($byte2 * 256));
  103. }
  104. private static function html2rgb($input) {
  105.         $input = ($input[0] == "#") ? substr($input, 1, 6) : substr($input, 0, 6);
  106.         return array(
  107.                 hexdec(substr($input, 0, 2)),
  108.                 hexdec(substr($input, 2, 2)),
  109.                 hexdec(substr($input, 4, 2))
  110.         );
  111. }
  112. }
  113. ?>


Но есть как всегда одно Но! Растерялся

Если смотреть по скрипту:
Файлы перекодирует нормально через LAME в .wav формат.
А дальше начинается "ахтунг".. То ли дело в путях, то ли я чего-то не так указал.
Если подставить в скрипт название уже сгенерированного .wav файла от руки вот в это место [ $handle = fopen($filename, "r"); ] - то при обновлении страницы происходит генерация изображения + .wav'ку удаляет, как и задуманно в скрипте (т.е. все работает).

В основном ругается так:

(не может открыть, хотя файл есть и права стоят 777)
fopen(D:\AppServ\www/uploads/39/d917f82583b7bac18e2b.wav) [function.fopen]: failed to open stream: No such file or directory in ...

(не может удалить, хотя файл есть и права стоят 777, если воткнут @ то удалит файл)
Warning: unlink(D:\AppServ\www/uploads/39/b763a2f212b89ad4e840.mp3) [function.unlink]: No such file or directory in

Куда копать? Однако


-----
https://vk[dot]com/tvoycase_ru - Твой чехол со своим дизайном
 
 Top
DelphinPRO
Отправлено: 23 Июля, 2015 - 01:00:17
Post Id



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


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


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




В windows нет понятия "права доступа" Улыбка они всегда 0777

Первый вопрос напрашивается сам собой:
Путь-то правильный? D:\AppServ\www/uploads/39/d917f82583b7bac18e2b.wav

Кроме того, есть еще один очевидный косяк, на который документация недвусмысленно намекает. Нет, не намекает, там прямо написано про Windows.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Viper
Отправлено: 23 Июля, 2015 - 12:01:34
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




Говнокод канеш у вас знатный. Не проще было взять ffmpeg + gnuplot?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
maragon
Отправлено: 23 Июля, 2015 - 18:00:40
Post Id



Посетитель


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


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




DelphinPRO пишет:
В windows нет понятия "права доступа" Улыбка они всегда 0777

Спасибо, отныне буду знать! Улыбка

Viper пишет:
Говнокод канеш у вас знатный. Не проще было взять ffmpeg + gnuplot?

И вправду говнокод. С ffmpeg'ом разобрался, как по мне проще и функциональнее.
А вот вопрос, как перегнать wav to png через gnuplot? Примеров не нашел..
Хм


-----
https://vk[dot]com/tvoycase_ru - Твой чехол со своим дизайном
 
 Top
IllusionMH
Отправлено: 23 Июля, 2015 - 18:06:18
Post Id



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


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


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




maragon, а напрямую не вариант?
https://trac[dot]ffmpeg[dot]org/wiki/Cre[dot][dot][dot]20Audio%20Stream

(Отредактировано автором: 23 Июля, 2015 - 18:06:35)

 
 Top
Viper
Отправлено: 23 Июля, 2015 - 21:27:42
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




maragon пишет:
А вот вопрос, как перегнать wav to png через gnuplot? Примеров не нашел..

Файл waveform.plt (таск для gnuplot):
CODE (htmlphp):
скопировать код в буфер обмена
  1. set terminal png transparent size 1000,100;
  2. set output "waveform.png";
  3.  
  4. unset tics;
  5. unset border;
  6. set lmargin 0;
  7. set rmargin 0;
  8. set tmargin 0;
  9. set bmargin 0;
  10.  
  11. plot "d:\\data.dat" binary filetype=bin format='%int16' endian=little array=1:0 with lines lt rgb "#333333";


и 2-е команды для запуска через консоль:

CODE (htmlphp):
скопировать код в буфер обмена
  1. ffmpeg -i 01.wav -ac 1 -filter:a aresample=8000 -map 0:a -c:a pcm_s16le -f data data.bin
  2.  
  3. gnuplot waveform.plt


PS! Пути соответственно поправите сами. gnuplot я брал dynamic(с static-билдом не пробовал).


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB