Ищется алгоритм плейлиста (Дайте совет, если не трудно)

Модератор: Модераторы разделов

Аватара пользователя
Mark5
Сообщения: 13
ОС: Gentoo

Ищется алгоритм плейлиста

Сообщение Mark5 »

Задача такая:

Есть набор музыкальных звуковых файлов (известной продолжительности).
Продолжительность каждого и имя файла например в массиве $muzik = array(продолжительность, имя файла);

Есть еще массив сбоек $sbojki = array (время начала сбойки, продолжительность сбойки, имя файла).

Что требуется? Надо заполнить пустоту между сбойками файлами музыки из массива $muzik случайным образом.

Время начала сбоек задано мягко. Т.е. сбойка может начаться с точностью например +-(плюс минус) 5 минут.

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

На выходе должен получиться еще один массив типа $playlist = array(время начала, имя файла);

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

Прошу подсказать направление - куда копать, какой алгоритм использовать? Чую что решение на поверхности, но не могу понять как реализовать?
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: Ищется алгоритм плейлиста

Сообщение minoru-kun »

I. Пусть $m - переменная, содержащая в себе значение текущего системного времени, а $n - абсолютное время старта следующей рандомной сбойки. Тогда, длинна промежутка времени, который необходимо заполнить музыкой $l = ($n - $m), причем алгоритм определен только когда $l > 0.
II. Надергиваем рандомные песни таким образом, что их общее $t >= $l;
III. Скармливаем получившийся фрагмент на выход, и (после того, как произведение закончится) - переходим к П. I.

Если требуется сгенерить плейлист "наперед", то в П.I. следует считать текущим временем предполагаемое начало передачи (на первую итерацию), или абсолютное время конца последней сбойки (после выполнения П. III).
Спасибо сказали:
Аватара пользователя
Mark5
Сообщения: 13
ОС: Gentoo

Re: Ищется алгоритм плейлиста

Сообщение Mark5 »

в итоге может получится что от конца текущего муз. фрагмента до начала сбойки будет промежуток > точности времени начала сбойки, но < продолжительности имеющихся муз. фрагментов

что тогда делать? все по новой считать?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Ищется алгоритм плейлиста

Сообщение /dev/random »

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

Впрочем, если нет песен длиннее 10 минут, то алгоритм minoru-kun'а годится. Только проверять нужно не $t>$l, а $t>($i-5мин)
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: Ищется алгоритм плейлиста

Сообщение minoru-kun »

в итоге может получится что от конца текущего муз. фрагмента до начала сбойки будет промежуток > точности времени начала сбойки, но < продолжительности имеющихся муз. фрагментов

Я так понимаю, муз.фрагменты все равно надергиваются рандомом? %) Выходит, что, хотя сбойка всегда будет запаздывать, время будет заполняться полностью. Или есть правило, что один и тот же муз.фрагмент не должен повторяться? %)
Спасибо сказали:
Аватара пользователя
Mark5
Сообщения: 13
ОС: Gentoo

Re: Ищется алгоритм плейлиста

Сообщение Mark5 »

желательно - чтобы в течение дня музыка не повторялась и надергивалась рандомом.

а если сделать массив музыки довольно большой?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Ищется алгоритм плейлиста

Сообщение /dev/random »

Можно воспользоваться чем-нибудь таким:
(сам не проверял! возможны ошибки!)

Код: Выделить всё

#!/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 значения, разделенных пробелами: длину песни в секундах и файл, в котором она содержится. Список должен быть достаточно длинным, чтобы песен хватило до последнего перерыва.

На выходе - список файлов в том порядке, в котором их необходимо проигрывать.

Блин, описание длиннее самого скрипта :)
Спасибо сказали: