Предыстория — это клиент, который хотел, чтобы видео в режиме реального времени воспроизводилось 24/7 в соответствии со следующими требованиями:
Так что в основном они хотят убедиться, что-то всегда играет, когда кто-то подключается к потоку.
Что я сделал, это:
[НАСТОЯЩИЙ ЖИВОЙ]Тогда у меня есть центральный live.m3u8, который делает следующее (по порядку):
Моя таблица БД построена вокруг того факта, что фиксированная Начните время для первый видео должен выбирается при создании списка, и список всегда будет смежным, и создает непрерывный 24-часовой цикл вокруг этого. Например, если они выбирают 10 видео по 40 минут каждое, начиная с 1500 часов; затем я создам блоки по 400 минут вокруг этого 1500 — 1900 часового окна (0300-0700-1100-1500-1900-2300).
Это делается путем записи в базе данных времени начала каждого сегмента, поэтому моя таблица выглядит так:
id order extinf start file
112 100 10.000000 15:00:00 112.ts
113 101 10.000000 15:00:10 113.ts
114 102 10.000000 15:00:20 114.ts
300 103 12.000000 15:00:30 300.ts
301 104 12.000000 15:00:42 301.ts
302 105 12.000000 15:00:54 302.ts
303 106 12.000000 15:01:06 303.ts
Так что, когда пользователь запрашивает «живой» поток, мой запрос выглядит так:
SELECT
m3u8.order, m3u8.extinf, m3u8.file, m3u8.start
FROM
video_hls
WHERE
m3u8.start >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MINUTE),'%H:%i:%s') AND m3u8.start <= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 3 MINUTE),'%H:%i:%s')
ORDER BY
m3u8.order ASC
Этот трюк выбора предыдущей минуты и следующих 3 минут, а также использование тега # EXT-X-DISCONTINUITY заставляет игроков думать, что они присоединились к текущему прямому эфиру, и обрабатывать их как таковые.
Теперь проблема в том, что всякий раз, когда кто-то смотрит на границу 23: 59: 59-00: 00: 00, он теряет поток и должен повторно подключиться, после этого все в порядке.
Столбец «start» представляет собой простое время, мой оператор SELECT имеет дело только с H: i: s, так что я ничего не вижу, чтобы это произошло, обслуживаемый файл m3u8 выглядит прекрасно (он работает для всех остальных 86398 секунд дня), и он не содержит никакой информации о дате, просто простые файлы один за другим.
Кажется, я не могу найти никакой причины для такого поведения … (я, к сожалению, не могу поделиться URL-адресом, так как это служба подписки — и тщательно контролируемая и защищенная).
Задача ещё не решена.
Других решений пока нет …