PDA

Просмотр полной версии : [Вопрос] Воспроизведение музыки.



Dima_Turkow
02.02.2014, 18:03
Хочу сделать воспроизведение музыки, но чтобы она играла по порядку, а не именно 1 указывать. Помогите буду благодарен!

[ForD]
02.02.2014, 22:32
Эм,выскажу свое предположение.

По сути можно сделать все через таймер,узнаешь время 1-го трека,ставишь таймер на отсчет(врямя указываешь столько,сколько длиться трек) по окончании таймера(ну и по сути трека) начинаеться воспроизведение следующего трека

L0ndl3m
02.02.2014, 23:42
;26309']Эм,выскажу свое предположение.

По сути можно сделать все через таймер,узнаешь время 1-го трека,ставишь таймер на отсчет(врямя указываешь столько,сколько длиться трек) по окончании таймера(ну и по сути трека) начинаеться воспроизведение следующего трека

Верно, так и есть.

В начало мода:



new const TrackLength[] = {0, 0, 0, 0, 0}; // Продолжительность треков

new const TrackStreams[][] = {
"http://ссылка на аудиопоток первого трека",
"http://ссылка на аудиопоток второго трека",
"http://ссылка на аудиопоток третьего трека",
"http://ссылка на аудиопоток четвёртого трека",
"http://ссылка на аудиопоток пятого трека"
};


При проигрывании трека:



new r = random(sizeof(TrackLength));
PlayAudioStreamForPlayer(playerid, TrackStreams[r]);
SetPVarInt(playerid, "TrackID", r);
SetPVarInt(playerid, "TrackLength", GetTickCount() + TrackLength[r] * 1000);


В public OnPlayerConnect:


SetPVarInt(playerid, "TrackID", -1);

В односекундный таймер, в цикл:



new tick = GetTickCount();
if(GetPVarInt(playerid, "TrackID") && GetPVarInt(playerid, "TrackLength") <= tick)
{
new r = random(sizeof(TrackLength));
PlayAudioStreamForPlayer(playerid, TrackStreams[r]);
SetPVarInt(playerid, "TrackID", r);
SetPVarInt(playerid, "MusicLength", tick + TrackLength[r] * 1000);
}


При отключении трека:



StopAudioStreamForPlayer(playerid);
SetPVarInt(playerid, "TrackID", -1);

DeimoS
02.02.2014, 23:45
Если с момента моего последнего ознакомления с функциями воспроизведения потоков ничего не изменилось, Ford прав. И я отслеживание сделал бы следующим образом
Сначала две глобальные переменные

new MusicTime[6];//Где 5 - число треков, которые мы будем воспроизводить
new MusicTimer;//В данную переменную запишем ID таймера, дабы после окончания воспроизведения убить ненужный таймер
new track;//А тут мы будем хранить номер трека, который воспроизведён
Далее в функцию, где идёт воспроизведение первого текста, ставим следующее

MusicTimer = SetTimer...//Секундный таймер
MusicTime[0] = 60*3+20;//Продолжительность трека - 3 минуты 20 секунд
track = 0;//А тут номер трека, который мы воспроизвели. Он равен номеру ячейки

Ну и паблик, который будет вызываться таймером

forward Blabla();
public Blabla()
{
if(MusicTime[track] != 0)
{
MusicTime[track]--;
if(MusicTime[track] == 1)
{
track++;
switch(track)
{
case 0:
{
MusicTime[track] = 60*3+20
//Запускаем новый трек
}
case 1:
{
MusicTime[track] = 60*2+50
//Запускаем новый трек
}
case 2:
{
MusicTime[track] = 60*1+52
//Запускаем новый трек
}
case 3:
{
MusicTime[track] = 60*4+12
//Запускаем новый трек
}
case 4:
{
MusicTime[track] = 60*3+22
//Запускаем первый трек, либо останавливаем всё, убивая таймер и приравнивая track к 0
}
}
}
}
return 1;
}
Ну и всё. Такой способ позволяет удобно управлять треками (узнать время до окончания трека, делать цикличность воспроизведения плейлиста и т.п.). Только нужно учесть, что скорость начала воспроизведения трека (задержка) зависит от интернета игрока, если мне память не изменяет. Хотя не уверен. Плюс эта система будет работать только если трек играет общий для всех и только один. Если каким-то образом нужно сделать для каждого игрока свои песни, придётся все переменные и таймер переводить в массив под всех игроков