Как отдавать в один видеопоток несколько файлов подряд?
Дано:
Есть некий скрипт, который сохраняет в папку фрагменты видео по 30 секунд.
Нужно сделать так, чтобы в браузере все это отображалось одним цельным видео.
Как это можно сделать?
В приоритете Node, но если есть вариант на Pythone, тоже хорошо.
Если контейнер видео - какой-то из семейства mpeg, и параметры видеофрагментов (кодек, размер) идентичны, то их можно просто склеивать в один файл или отдавать последовательно в сокет без дополнительной обработки. С точки зрения декодера это будет валидный видеопоток.
Но вообще это скорее задача, которую нужно решать на стороне браузера (как воспроизвести цельное видео из фрагментов). По крайней мере видеохостинги работают именно так.
Дмитрий, сложность не в том, что видео несколько, а в том, что они постоянно создаются новые. Стримить один видеофайл просто, а как сделать, чтобы в этот же стрим добавлялись данные из все новых файлов?
Tenebrius, Ну а в чем проблема при конце очередного файла делать скан директории на наличие новых файлов и продолжать стриминг уже с них? Это можно даже делать в отдельном потоке параллельно со стримингом
Tenebrius, советую поискать по ключевым словам HTTP Live Streaming. В принципе, если эти файлы нарезаются самим ffmpeg, то у него есть возможность самому генерить m3u8-файлы к фрагментам видео.
dooMoob, именно в этом мой вопрос. Как это сделать? Как отследить, что одно видео заканчивается, и как в тот же поток начать передавать другое? Ведь при инициализации видеопотока передается размер передаваемого файла. Если указать размер первого файла, то при окончании его передачи поток закроется.
Tenebrius, значит указывайте максимально большой, либо реконнект при каждом новом файле. На вопрос как узнать размер того, чего мы не знаем - ответа нет.
Как узнать когда файл закончился - вы наткнетесь на EOF. Попробуйте открыть любой видео файл через `rb` и проитерироваться по линиям.
Tenebrius, Представляю такой алгоритм:
1 поток раз в n секунд делает скан директории и кладет в очередь имена новых файлов
2 поток в бесконечном цикле берет с очереди очередной файл и отдает его в поток