Для самых нетерпеливых, результат можно посмотреть тут, а тем кому интересна предыстория, и куча фэйлов с которыми пришлось столкнуться, добро пожаловать в остросюжетный триллер под названием "Скупой платит дважды" 😜
Небольшая лирическая предистория:
Уже пару лет, как подкармливаю птичек на даче. Работаю я из дома, и рабочий стол стоит прямо перед окном, за которым висит кормушка. Каждое утро насыпаю новую порцию семечек, а потом наблюдаю за разными птицами, слетающимися на пир.
Оказывается, пернатый мир средней полосы России довольно богат. Очень часто приходилось пользоваться помощью Google чтобы определить, что за птичка пожаловала на обед.
Чаще всего, конечно, прилетают обычные синички. Эта птичка очень осторожная. Сначала сядет на ветку растущей рядом яблони и осмотрит округу. Потом быстро подлетит, схватит семечку, и обратно на ветку, там уже ее шелушит.
Еще частые гости – воробьи. Эти на порядок наглее. Прилетают всегда стайкой, едят сидя прямо в кормушке. Те, что посильнее и понаглее еще и отгоняют своих товарищей. Забавно смотреть на их противоборство.
Зимой часто кормушку навещают снегири. Оказывается, у самки снегиря брюшко совсем даже не красное, а просто серое. Я по первости долго не мог понять, что за странная птица, вроде похожа на снегиря, но не красная!
Более редкие гости, которых видел – малиновки, лесные канарейки, дрозды, соловьи. Пару раз видел дубоноса. Прошлой зимой часто прилетали две куропатки, они на кормушку не садились, «паслись» в снегу под ней.
Особенной пикантности ситуации добавляет моя домашняя кошка. Очень уж любит она охотиться на всякую живность. Когда она дома, сядет рядом перед окном и с азартом наблюдает за птичками. Даже «щебетать» пытается. Потом просится на улицу, и тогда птицам приходится быть в двойне осторожнее. Несмотря на совсем демаскирующий цвет и колокольчик, кошка иногда умудряется поймать какого-нибудь зазевавшегося пернатого.
Во общем, под окном у меня разворачивается интересное и порой завораживающее кино, с природными актерами. Вот я и подумал, а чего это я только один на все это смотрю, надо поделиться с миром прекрасным зрелищем. Век высоких технологий на дворе как никак. Решил поставить камеру и организовать эту трансляцию.
Мой опыт с видеостримингом ограничивался только трансляциями через OBS на ютуб коло десяти лет назад. Поэтому засел за изучение темы. Задачу поставил себе такую: организовать трансляцию с камеры за окном на сайт через NAT. При этом канал у меня не слишком быстрый, а помимо трансляции надо еще и обычнми делами в интернете заниматься.
Первое на что наткнулся на связку - gstreamer + mediamtx. Mediamtx поднимаем на
А значит можно заказывать камеру, и пока она придет писать софт. С выбором камеры особо не заморачивался. Так как это, все-таки, пет-проект, бюджет минимальный. Требование к камере было всего одно - возможность работать по сети. Заказал на маркете такую, всего за полтора килорубля:
Скрытый текст
Когда она пришла - разочарованию моему не было предела. Камера умела работать только с перенасыщенным рекламой китайским приложением и больше никак. Ни тебе вебинтерфейса, ни поддержки популярных протоколов... На 4pda нашел тему посвященную ей - раньше вроде можно было через специальные файлики на флешке пробудить в ней нужный функционал, но в более поздних версиях это пофиксили. И мне попалась как раз такая. Покупка оказалась бесполезной, разве что блок питания от нее использовал со следующими камерами.
Вторая покупка была уже более осознанной. В фильтрах выставил обязательную поддержку RTSP. За два килорубля с копейками выбор пал на такую:
Скрытый текст
Конечно это совсем не уличная камера, но напомню про бюджет, хотелось сэкономить, и пока довольствоваться этой, защитив ее от снега и дождя куполом из пластиковой канистры. (спойлер: сэкономить опять не вышло).
У этой модели, как мне казалось, был только один недостаток - вебинтерфейс работал через ActiveX и соотвественно только в Windows. Но это казалось не большой проблемой - настроил один раз, а потом через rtsp забирай поток на любом устройстве.
Пока длилась эта эпопея с камерой - писал код. Как уже говорил, саму трансляцию будет осуществлять mediamtx, а для остального написал на NodeJS небольшой вебсокет сервер. Нужен были комментарии на сайте рядом с видео, аля ютуб. Само вебприложение запилил на react с проигрыванием hls потока который отдает mediamtx.
На первый взгляд все работало, но начались проблемы. У камеры слишком широкий угол обзора (обычно это фишка, но в моем случае - недостаток), и в кадр попадало много лишнего. Качество изображения было откровенно хреновым. Стал пытаться решить эту проблему с помощью параметров gstreamer.
Первым делом попробовал отправлять только часть кадра на сервер. С помощью плагина videobox, можно задать отступы со всех сторон для кадра. Но естественно при таком подходе потерял в качестве - если из 1080p вырезать 640х360 - получим 360p. В настройках камеры поднял поток до 4k и стал вырезать 1080p. Таким образом с углом обзора ситуация вроде решилась. Пришлось правда еще плагином clockoverlay накладывать время на вырезанный кадр, потому что время что накладывало камера осталось в вырезанном куске.
Оставалась проблема с качеством. Пришла мысль, т.к я использую gstreamer, все равно что использую в качестве источника. Почему бы не попробовать обычную USB вебкамеру? Сказано - сделано. Была заказана вебка с наименьшим углом обзора и активный USB удлинитель. Общей стоимостью примерно 2 тысячи рублей.
Скрытый текст
Это оказался тихий ужас. У камеры была просто ужасная светочувствительность. Даже в помещении при искусственном освещении зернистость на изображении просто зашкаливала. Оказалось что удлинитель поддерживает только питание, но никак не данные - камера по нему просто отказывалась работать. Во общем выкинутые на ветер деньги.
Все это время вел трансляцию через "старую" IP камеру, и заметил еще много проблем. Команда gstreamer выглядела примерно так:
gst-launch-1.0 rtspsrc location="rtsp://192.168.0.10:554/user=admin&password=&channel=1&stream=0?.sdp" protocols=tcp latency=0 !
decodebin ! queue !
videobox autocrop=false left=1000 right=700 top=200 bottom=800 !
clockoverlay font-desc="Sans 14" valignment=bottom time-format="%d.%m.%Y %H:%M:%S +3GMT" shaded-background=true !
queue ! x264enc speed-preset=veryfast tune=zerolatency !
rtspclientsink location=rtsp://birds.unger1984.pro:8554/mystream user-id=*** user-pw=*** protocols=tcp latency=0
Отдельно надо сказать про опции protocols=tcp - если ее не указывать - начинаются потери кадров. С UDP gstreamer совершенно некорректно работает. На выходе получаем в лучшем случае серый экран. Но с этой опцией начал отваливаться сам gstreamer. Как только он начинает ловить большую потерю кадров - просто падает! По этой причине трансляция постоянно прерывалась.
Решением стала замена gstreamer на ffmpeg - он тоже умеет ретранслировать поток, и работает заметно стабильнее. Пропуски кадров случаются, иногда на изображении появляются артефакты, но довольно быстро пропадают и это бывает редко.
Пока с этим разобрался, пришла новая камера, уже почти за 4к рублей:
Скрытый текст
Камера той же фирмы, так же работает через ActiveX, но она уже уличная и качество картинки у нее на порядок выше (характеристики почти одинаковые, но в этот раз они указаны реальные а не с потолка). В этот раз качество меня полностью устроило, в FullHD поток отдавался просто великолепно, но появились другие проблемы.
Напоминаю, все дело происходит на даче, где традиционно с интернетом проблемы. Хоть пару лет назад до нас и дотянули оптику, но канал оставался совсем узким. Часто даже на рабочие созвоны не хватало! Если через это пустить еще и постоянный стрим в 1080p - сами понимаете что будет. Поэтому была куплена симка МТС от Экомобайл с полным безлимитом за 700р/мес. Поставлен отдельный роутер с ней и трансляция организована через него.
Одним прекрасным утром трансляция работать перестала. Опытным путем было выяснено что не работает интернет на сим-карте. Качество сигнала отличное, в личном кабинете написано что остатки по пакетам - Безлимит, но интернета при этом нет. Разговор с техподдержкой, выявил следующие - лимит по карте 150Гб, после ограничение скорости до 64кб/с! Быстрый поиск в интернете показал что реально безлимитных тарифов не существует ни у кого. Максимум 1Тб а дальше - здравствуй ограничение по скорости!
Надеясь на чудо, позвонил своему "проводному" провайдеру - а не появилось ли новых, более скоростных тарифов? И тут выяснилось что у меня старый тариф и за те же деньги давно доступен 100Мб! Ни в личном кабинете ни на сайте подобной информации почему-то нет. Если бы не позвонил - так бы и сидел с ущербной скоростью, а тут по звонку просто переключили и все.
Ну оставались совсем мелочи - научить mediamtx разбивать входящий поток по разрешению на несколько низкокачественных, сделать переключалку разрешений на сайте (к сожалению самая главная фишка HLS с автовыбором качества пока не работает) и написать мобильное приложение.
Приложение писал на Flutter и публиковал только в RuStore. В Google Play публиковать больше ничего не могу в связи с тем что не могу обновить данные платежного профиля, по известным причинам.
Вот такая история получилась. Хотел сэкономить на пет‑проекте — в итоге потратил гораздо больше чем мог бы. Кончено сам виноват — до конца в теме не разобрался, но как говорится «опыт — сын ошибок трудных». Зато теперь, вы можете насладиться зрелищем птичек вместе со мной https://birds.unger1984.pro/
Автор: Cobalt