Форумы портала PHP.SU » Объявления » Наработки по собственным проектам » Сетевое радио на PHP

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

1. DeepVarvar - 07 Июля, 2015 - 12:18:48 - перейти к сообщению
Собственно, в здании, где дислоцируется наш офис, во всю идут ремонтные работы.
А с интернетом то проблемы.
Шеф приобрел какой-то свисток, но он не спасает, на всех его не хватит.

Так вот.
Я, обязательно буду сидеть с нахлобучеными наушниками.
Мне это помогает абстрагироваться и спокойно работать.
Причем жанр музыки совершенно не важен.
Остальным, как оказалось -- тоже.

Вобщем, чтобы не тратить драгоценные мегабайты на аудиострим извне, мы слили музло у кого какое было в одно место.
А я запилил наколенный скрипт, который всю эту кухню обслуживает:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. $speed = 20; // kbps
  4. $path = realpath('../../Music/streamer') . '/';
  5.  
  6. if (!array_key_exists('HTTP_ICY_METADATA', $_SERVER)) {
  7.     exit('You must open this URL with audio player!');
  8. }
  9.  
  10. header('ICY 200 OK');
  11. header('Icy-Notice2: Stream server via PHP v-0.1-alpha');
  12. header('Icy-Name: Local radio');
  13. header('Icy-Genre: misc');
  14. header('Icy-Url: ' . $_SERVER['HTTP_HOST']);
  15. header('Icy-Pub: 0');
  16.  
  17. $chunkSize = $speed * 1024 * 8;
  18. $tracks = glob($path . '*.mp3');
  19. if (!$tracks) {
  20.     $tracks = array();
  21. }
  22.  
  23. while (1) {
  24.     // shuffle all tracks
  25.     shuffle($tracks);
  26.     // each track by track
  27.     foreach ($tracks as $track) {
  28.         $fp = @ fopen($track, 'rb');
  29.         if ($fp) {
  30.             // play (streaming) track
  31.             while (1) {
  32.                 $data = fread($fp, $chunkSize);
  33.                 print $data;
  34.                 flush();
  35.                 if (strlen($data) < $chunkSize) {
  36.                     break;
  37.                 } else {
  38.                     sleep(1);
  39.                 }
  40.             }
  41.         }
  42.     }
  43. }


Достаточно указать откуда тащить аудио и скорость отдачи.
Собственно 20 кбпс достаточно.

Открываете ссылку с любого плеера, и вуаля!
Но для каждого приконнектившегося листенера будет играть свой набор треков.
А реализация одного общего эфира не влезла бы в эти 44 строки ))

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

Кароче, кому надо -- забирайте.
2. caballero - 07 Июля, 2015 - 14:09:29 - перейти к сообщению
ну, Fm радио в мабилке решает проблему и без PHP
3. DeepVarvar - 07 Июля, 2015 - 14:29:42 - перейти к сообщению
Ага, с рекламой каждые 5 минут, новостями ниачом, "высокоинтеллектуальными" изречениями говорунов, и заезженым плейлистом времён Ильича.
4. Мелкий - 07 Июля, 2015 - 14:42:38 - перейти к сообщению
Ну почему не FM догадался даже такой консерватор как я.
А вот почему не локальный проигрыватель?
5. esterio - 07 Июля, 2015 - 15:06:24 - перейти к сообщению
Мелкий пишет:
А вот почему не локальный проигрыватель?

Согласен. VLC умеет стримить без особых проблем и есть под *nix-ы и окна
Хотя за код +1 в копилку
6. DeepVarvar - 07 Июля, 2015 - 16:52:26 - перейти к сообщению
ВЛЦ часто падает на стриме, уже проверено ))
(Добавление)
Ах, да -- еще так и хотелось чтобы все слушали разное, но из одной копилки.

 

Powered by ExBB FM 1.0 RC1