Задача такая:
Есть набор музыкальных звуковых файлов (известной продолжительности).
Продолжительность каждого и имя файла например в массиве $muzik = array(продолжительность, имя файла);
Есть еще массив сбоек $sbojki = array (время начала сбойки, продолжительность сбойки, имя файла).
Что требуется? Надо заполнить пустоту между сбойками файлами музыки из массива $muzik случайным образом.
Время начала сбоек задано мягко. Т.е. сбойка может начаться с точностью например +-(плюс минус) 5 минут.
Т.е. пишу что-то типа проги для радиостанций, когда идет музыка, потом в заданное время - раз и рекламная сбойка, или джингл радиостанции.
На выходе должен получиться еще один массив типа $playlist = array(время начала, имя файла);
Можно конечно всё это делать руками, но долго и лень. Можно конечно взять уже готовое решение - но порылся в нете - они все с закрытым исходником и стоят денег.
Прошу подсказать направление - куда копать, какой алгоритм использовать? Чую что решение на поверхности, но не могу понять как реализовать?
Ищется алгоритм плейлиста (Дайте совет, если не трудно)
Модератор: Модераторы разделов
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: Ищется алгоритм плейлиста
I. Пусть $m - переменная, содержащая в себе значение текущего системного времени, а $n - абсолютное время старта следующей рандомной сбойки. Тогда, длинна промежутка времени, который необходимо заполнить музыкой $l = ($n - $m), причем алгоритм определен только когда $l > 0.
II. Надергиваем рандомные песни таким образом, что их общее $t >= $l;
III. Скармливаем получившийся фрагмент на выход, и (после того, как произведение закончится) - переходим к П. I.
Если требуется сгенерить плейлист "наперед", то в П.I. следует считать текущим временем предполагаемое начало передачи (на первую итерацию), или абсолютное время конца последней сбойки (после выполнения П. III).
II. Надергиваем рандомные песни таким образом, что их общее $t >= $l;
III. Скармливаем получившийся фрагмент на выход, и (после того, как произведение закончится) - переходим к П. I.
Если требуется сгенерить плейлист "наперед", то в П.I. следует считать текущим временем предполагаемое начало передачи (на первую итерацию), или абсолютное время конца последней сбойки (после выполнения П. III).
-
Mark5
- Сообщения: 13
- ОС: Gentoo
Re: Ищется алгоритм плейлиста
в итоге может получится что от конца текущего муз. фрагмента до начала сбойки будет промежуток > точности времени начала сбойки, но < продолжительности имеющихся муз. фрагментов
что тогда делать? все по новой считать?
что тогда делать? все по новой считать?
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: Ищется алгоритм плейлиста
Тогда, боюсь, только прямым перебором возможных выборок. Кроме того, следует учитывать, что возможна ситуация, когда задача не имеет решения.
Впрочем, если нет песен длиннее 10 минут, то алгоритм minoru-kun'а годится. Только проверять нужно не $t>$l, а $t>($i-5мин)
Впрочем, если нет песен длиннее 10 минут, то алгоритм minoru-kun'а годится. Только проверять нужно не $t>$l, а $t>($i-5мин)
-
minoru-kun
- Сообщения: 621
- ОС: Debian GNU/Linux
Re: Ищется алгоритм плейлиста
в итоге может получится что от конца текущего муз. фрагмента до начала сбойки будет промежуток > точности времени начала сбойки, но < продолжительности имеющихся муз. фрагментов
Я так понимаю, муз.фрагменты все равно надергиваются рандомом? %) Выходит, что, хотя сбойка всегда будет запаздывать, время будет заполняться полностью. Или есть правило, что один и тот же муз.фрагмент не должен повторяться? %)
-
Mark5
- Сообщения: 13
- ОС: Gentoo
Re: Ищется алгоритм плейлиста
желательно - чтобы в течение дня музыка не повторялась и надергивалась рандомом.
а если сделать массив музыки довольно большой?
а если сделать массив музыки довольно большой?
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: Ищется алгоритм плейлиста
Можно воспользоваться чем-нибудь таким:
(сам не проверял! возможны ошибки!)
Первым параметром в командной строке идет допустимая ошибка (в секундах) задания моментов начала перерывов. Она должна быть не меньше половины длины самой длинной песни. Дальнейшие параметры идут тройками: момент (в секундах от начала эфира) начала очередного перерыва, его длина (в секундах) и имя соотв. аудиофайла.
На вход подается исходный плэйлист - набор строк, каждая содержит 2 значения, разделенных пробелами: длину песни в секундах и файл, в котором она содержится. Список должен быть достаточно длинным, чтобы песен хватило до последнего перерыва.
На выходе - список файлов в том порядке, в котором их необходимо проигрывать.
Блин, описание длиннее самого скрипта
(сам не проверял! возможны ошибки!)
Код: Выделить всё
#!/bin/bash
time=0
eps="$1"
shift
shuf | until [ -z "$1" ]
do
read len file
echo "$file"
time=$(( time + len ))
if [ "$(( time - $1 + eps ))" -gt 0 ]
then
time=$(( time + $2 ))
echo "$3"
shift 3
fi
doneПервым параметром в командной строке идет допустимая ошибка (в секундах) задания моментов начала перерывов. Она должна быть не меньше половины длины самой длинной песни. Дальнейшие параметры идут тройками: момент (в секундах от начала эфира) начала очередного перерыва, его длина (в секундах) и имя соотв. аудиофайла.
На вход подается исходный плэйлист - набор строк, каждая содержит 2 значения, разделенных пробелами: длину песни в секундах и файл, в котором она содержится. Список должен быть достаточно длинным, чтобы песен хватило до последнего перерыва.
На выходе - список файлов в том порядке, в котором их необходимо проигрывать.
Блин, описание длиннее самого скрипта