[Plugin] Server's Radio Plugin
#1

Server Broadcaster
Версия 1.6.0
Автор: jhonyxakep (Андрей Недобыльский)
Mail:jhonyxakep@qip.ru
ICQ:354794596
Jabber:jhonyxakep@qip.ru

Описание:

Плагин позволяет превратить сервер SA:MP в полноценную интернет радиостанцию
Работает на подобии Icecast/Shoutcast серверов.

Плагин использует библиотеку BASS (un4seen.com) для воспроизведения и вещания звука.

Установка:

Положите файлы из папки plugins в папку plugins на сервере.

Windows:
В связи с особенностями сервера, файлы из папки system\win\ надо поместить в корневой каталог сервера (те там, где samp-server.exe) или в системный каталог system32.

*nix:
Файлы из папки system\nix\ надо положить в одну из папок /lib на сервере (/lib, /usr/lib, /usr/local/lib), однако рекомендую во все.


Пропишите плагин в секции plugins в конфиге SA:MP.

Для работы с функциями плагина подключите файл radio.inc к вашему скрипту.


Для *nix систем нужен установленный stdin/stdout энкодер (напирмер для вещания mp3 требуется Lame. Установка Lame для Debian/Ubuntu apt-get install lame)

Использование:

Функции плагина:

PlaySoundFileToStream(file[]); - Добавляет файл в эфир
PlaySoundUrlToStream(file[]); - Добавляет радиостанцию или удаленный файл в эфир
IsServerActive(); - возвращает true если сервер запущен, false если сервер остановлен
StopPlaying(); - удаляет текущий файл из эфира
SoundServerStart(commandline[],port[]); - Запускает сервер
SoundServerStop(); - Останавливает сервер

KickListener(listener[]); - кикает слушателя с сервера с последующим вызовом OnListenerDisconnect
SetStationNameURL(name[],URL[]); - Изменяет название и ссылку на сайт станции


Для запуска сервера вещания используется функция SoundServerStart.
Первый параметр функции – командная строка для запуска кодера. Если вы хотите использовать формат MP3, то вставьте строку "lame -r -s 44100 -b 128 –"
Где 128 это количество кбит/сек, которое вы хотите использовать для вещания. Если вам понадобится использовать другой формат вещания, вы можете взять любой кодер, поддерживающий принятие данных с stdin.

Второй аргумент – порт на котором надо вещать, или ip адрес, на который будет привязан сервер(если у вас несколько сетевых интерфейсов):

Например для запуска сервера на 8000 порту используйте "8000"
Для привязки сервера к адресу 127.0.0.1 используйте "127.0.0.1:8000"

После запуска сервера надо добавить файл в эфир, функцией PlaySoundFileToStream/PlaySoundUrlToStream.
Параметр file это путь до MP3, OGG, WAV, AIFF файла, который будет воспроизведен в эфире.

ВНИМАНИЕ! Добавлять новый файл в эфир стоит только после окончания предыдущего файла ИЛИ после вызова функции StopPlaying, иначе слушать одновременно несколько песен будет не очень приятно

Функция SoundServerStop останавливает сервер.

Колбеки:

OnSoundFileEnd(); - Вызывается когда достигнут конец текущего файла, или воспроизведение дальше невозможно
OnListenerConnect(listener[],path[]); - При подключении слушателя. Аргумент listener содержит в себе IP адрес и порт слушателя, path cодержит путь до файла открываемый слушателем.
OnListenerDisonnect(listener[]); - при отсключении слушателя. Аргумент listener содержит в себе IP адрес и порт слушателя

Плагин будет еще обновляться, и наполнятся функциями.

Внутри архива присутствует исходной код, демонстрационный FilterScript, и плагины

Закачка:

в прикреплении
Reply
#2

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

Хотелось бы услышать то отличие, которое я не смогу реализовать обычными скриптами.
Reply
#3

Ну как я понял это больше приблуда для контроля аудиопотоков, а не игрового процесса.
Т.е. ты игрокам скармливаешь свои поток, а вот тем что в нем играет ты управлешь через этот плагин.
Reply
#4

Quote:

Т.к. вещание обычного радио можно стандартными ф-иями сампа.

Например?

Если вы размещаете файлы на хосте, это не вещание, а простая закачка.
Когда вы именно вещаете, вы можете контролировать какая музыка конкретно в данный момент в эфире(например работа DJ прямо на сервере) При этом на стороне клиента не будет загрузки нового потока, вообщем полноценное интернет радио, разве пока что микрофон подключать нельзя.

Quote:

Т.е. ты игрокам скармливаешь свои поток, а вот тем что в нем играет ты управлешь через этот плагин.

Именно
Reply
#5

Интересно.
Хотелось бы увидеть больше примеров использования.
Допустим для TeamSpeak3 или просто для микрофона.
Reply
#6

ТимСпик на такой базе реализовать не получится (потомучто 5ти секундный буффер), хотя попробовать можно.
Микрофон с сервера чтоли? о0 Не думаю, что это удобно.

Кстати
Quote:

ВНИМАНИЕ! Добавлять новый файл в эфир стоит только после окончания предыдущего файла ИЛИ после вызова функции StopPlaying, иначе слушать одновременно несколько песен будет не очень приятно

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

Честно говоря других применения я найти не могу, это надо сидеть и думать или взять плагин тогда, когда это понадобится
Reply
#7

Вот идея: Звуковая реклама на сервере по расписанию. Можно просто запускать каждому входящему звуковой поток, и через определенное время выводить в эфир рекламу от спонсора =)
Reply
#8

Добавил новую версию.
Reply
#9

Добавил версию для *nix, поправил описание что-бы было более понятно что есмь это =)
Reply
#10

Молоток. Очень нужная вещь.

Для тех кто не понял для чего это нужно. Простой пример: Представьте себе часовой микс. т.е. мп3 файл с продолжительностью в 1 час, и вы хотите что бы он звучал в клубе. Ну ладно, заливаете вы файл на хост и включаете прямо в самп. Всё бы нечего, но как минимум мп3 файл при запуске всегда будет играть с самого начала, в то время когда другие (зашедшие в клуб раньше) уже будут дослушивать конец микса.

Вопрос к автору: Есть ли какие ни будь ограничения по подключениям (например кол-во) и будет ли что то типа KickListener(listener[]); - например для кика тех, кто не присутствует на сервере или для контроля лишний нагрузки создаваемой каким ни будь умником.
Reply
#11

Quote:

сть ли какие ни будь ограничения по подключениям (например кол-во) и будет ли что то типа KickListener(listener[]); - например для кика тех, кто не присутствует на сервере или для контроля лишний нагрузки создаваемой каким ни будь умником.

Ок. Добавлю =)
Reply
#12

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

Тем самым уже было бы весьма затруднительно забить\зафлудить потоковый сервер.

UPD: ах, да... сам хеш передаётся в строке адреса, типа localhost:8000/hash_u7c0oq1c5n1
Reply
#13

Тут вся проблема в том, что многие плееры (Windows Media например) подклчюается к серверу 4 раза, перед тем как начинает воспроизводить поток. Он использует это для определения названия потока и других параметров, в противном случае просто упадет.

Кстати чаем пара iport не хеш? он всегда уникален.
Reply
#14

jhonyxakep, ну так я как раз с расчётом на то, что бы слушать могли только с SAMP. А насчёт IP PORT. Хеш подразумевался уникальный каждый раз на каждого плеера зашедшего на сервер.
Reply
#15

Quote:

jhonyxakep, ну так я как раз с расчётом на то, что бы слушать могли только с SAMP

При подключении клиента к серверу клиент посылает в заголовке доп инфу. в т.ч. название плеера. В нашем случае клиент сампа посылает инфу о том, что он самп. Поэтому достаточно добавить в коллбеке заголовки клиента, и ServerKick и будет вам скриптовое счастье, и слушатели только с сампа.

Кстати в отличии от масдайного медиаплеера самп использует ту-же библиотеку BASS, что и сервер. Так что у них повышенная совместимость друг с другом.
Reply
#16

jhonyxakep, ты меня опять не понял. Речь идёт о безопасности и гарантированном канале для каждого игрока. Если я запущу на твой радио сервер 1000 клиентов, с заголовком SAMP-а.

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

UPD:
В общем сделай просто в OnListenerConnect(listener[]); что то вроде OnListenerConnect(listener[], channel[]);
channel = "lol123" если к адресу было добавлено /lol123, т.е. localhost:8000/lol123
Reply
#17

Quote:

В общем сделай просто в OnListenerConnect(listener[]); что то вроде OnListenerConnect(listener[], channel[]);
channel = "lol123" если к адресу было добавлено /lol123, т.е. localhost:8000/lol123

окей, сделал.

Обратите внимание, что паблик OnListenerConnect изменился.

+

Новая версия.
Reply
#18

Quote:
Originally Posted by jhonyxakep
View Post
окей, сделал.
Теперь уже вполне годно. Конкретно порадовал тем что просил KickListener и доп аргумент в OnListenerConnect. А также не успел попросить, как ты уже реализовал SetStationNameURL(name[],URL[]). Спасибо

Кстати не высокие ли задержки у функций и в отдельном ли это потоке всё?
Reply
#19

Quote:

Кстати не высокие ли задержки у функций и в отдельном ли это потоке всё?

Первый вызов добавления трека в лист использует основной поток, все последующие в отдельном.

Quote:

SetStationNameURL(name[],URL[])

Видимо я читаю мысли
Reply
#20

Слушай, а подумай о возможности запуска несколько серверов, по разным портам или каналам.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)