IPTV — это просто. Требуется помощь зала) Часть 1

Внезапно для себя обнаружил какое-то время назад интересный язык программирования — Go )

image

Ради спортивного интереса решил написать на нем что-то полезное, доброе, полезное для общества, ну и само собой поиграться с этим прекрасным языком. Сам-то я не местный знаю C, asm, Lua, пых и пр. перлы. Но особой радости от программирования не испытывал до того момента обнаружения Go) В области моей юрисдикции находились различные linux системы, включая интернет сервис провайдеры, IPTV-сервисы и пр. биллинги-шмиллинги. Ну да мы отвлеклись, ближе к сути. Я решил, что наиболее полезно будет работать с IPTV, на коем решил остановить свой взор, ибо юзал и cesbo астру и flussonic и другие добротные вещи вроде ffmpeg).

Подумал я, а почему бы и нет?) Одно хорошо для одних задач, другое — для других. Разве не будет уместным написать гибрид? Взять, к примеру, самое лучшее из всех и сделать такую себе идеальную химеру — iptv софт для гиков) Сказано — сделано. Выяснилось что, по сути, нужно примерно 2-3 месяца чтобы написать мясо, ну и год-другой на отладку — ибо дебуг — наше все.

Время от времени у меня возникали вопросы, которые требовали помощи зала и вот, наконец, я решился, потому как да пребудет со мной сила хабра) Опишу первую проблему вкраце — это конфиг. Понятно, что формат — JSON для удобства, ну а что в нем? Прошу рассмотреть мои наброски, поругать или похвалить. С учетом вашего опыта добавить что-то или убрать мусор.
Итак, начнем.

Серверы (порты, с которых будем раздавать вкусняшки и параметры): control (управление по вебу), dvr (архив, с выдачей HLS или mpegts), hls (чанкер), http (mpegts/http).

В этой части обсудим нижеследующий конфиг:

    "control": {
        "enable": false,
        "addr": ":8090",
        "host": "controller.domain.com,ferra.inside.loc"
    },
    "dvr": {
        "enable": true,
        "addr": ":1189",
        "host": "archive.myportal.com",
        "duration": 10,
        "fsync": 3,
        "timeout": 1800,
        "nice": 0
    },
    "hls": {
        "enable": true,
        "addr": ":12000",
        "host": "",
        "duration": 5,
        "num": 6,
        "timeout": 64
    },
    "http": {
        "enable": false,
        "addr": ":7070",
        "host": "mpegts.streamer.ly,mpegts.muxer.net"
    },

Теперь подробнее:

«host» — проверяем по типу grep запрос клиента Host:
«duration» — длина сегмента в секундах (для HLS и для архива (dvr) в HLS)
«num» — длина плейлиста HLS (в данном случае 6 сегментов по 5 секунд)
«fsync» — файловая система любит кешировать данные, а потом сливать их на диск, иногда это выглядит нормально, иногда не очень (лавинообразно). Чтобы прогреть кеш файловой системы нужно время от времени делать sync. В данном случае 3 рандомных файла в секунду. Наблюдать разницу можно тут:

iostat -x 1
sar -P ALL 1

«nice» — nice/prio горутины, которая пишет на диск (сработает и на мультикаст, но зачем?)
«timeout» — таймаут скачивания чанка в секундах (HLS/DVR)

Теперь прошу помощи зала — что нужно добавить или удалить? С учетом вашего опыта, взываю к силе Хабра — порекомендуйте как нужно сделать правильно, по фен-шую!

Внимательно читаю комментарии!

Специально для сайта ITWORLD.UZ. Новость взята с сайта Хабр