Решил с понедельника открыть сезон стримов на Ютубе. Идея банальная: показывать вживую, как я проектирую и вайбкодю пет-проект. Ну как пет-проект… В мае ему ужеРешил с понедельника открыть сезон стримов на Ютубе. Идея банальная: показывать вживую, как я проектирую и вайбкодю пет-проект. Ну как пет-проект… В мае ему уже

Как ИИ мне со стримом на Ютубе «помогал»

2026/03/19 18:54
9м. чтение
Для обратной связи или замечаний по поводу данного контента, свяжитесь с нами по адресу crypto.news@mexc.com

Решил с понедельника открыть сезон стримов на Ютубе. Идея банальная: показывать вживую, как я проектирую и вайбкодю пет-проект. Ну как пет-проект… В мае ему уже исполнится год и по архитектуре и функциям он разросся настолько, что уже приходится относиться к нему со всем уважением :)

Пошёл в ChatGPT, поделился идеей. «Идея замечательная!» — сказал чат и начал уже было расхваливать меня, но я его остановил. «Мне нужна помощь с OBS: хочу сделать в стриме плашку с информацией: кто я, что прямо сейчас делаю, ссылки, время, вот это всё». «Спокойствие, сейчас всё объясню!» — сказал ChatGPT — и именно с этого началась моя история.

OBS — это программа, популярная среди стримеров. Она позволяет захватывать видео с экрана, вебку, управлять всем этим делом с помощью сцен и транслировать результат, куда прикажете. И, главное, она бесплатная.

Я описал ЧатуГПТ свой сетап:

  • Три монитора и вебкамера;

  • На левом и центральном мониторе я буду работать и стримить;

  • На правом у меня будет висеть OBS и всё, что я не хочу показывать (Телеграм, файлы с заметками, дополнительное окно браузера и т.п.).

И объяснил, какие мне нужны сцены:

  • Левый монитор плюс моя вебка в правом нижнем углу;

  • Центральный монитор плюс моя вебка в правом нижнем углу;

  • Вебка на весь экран — когда я хочу отвлечься от работы и поделиться какой-нибудь офигительной историей.

Делюсь офигительной историей о том, как пытался делать контент-маркетинг для ОБИТа
Делюсь офигительной историей о том, как пытался делать контент-маркетинг для ОБИТа

«И вот для каждой из этих сцен мне нужна сверху плашка, на которой будут…»

  • Имя стримера (моё имя, Егор Камелев);

  • Информация о том, какой сейчас транслируется монитор (или вебка);

  • Редактируемая текстовая информация о том, что именно происходит на стриме прямо сейчас;

  • Ссылки на продвигаемые ресурсы;

  • Дата и время (чтобы можно было понять — это живой стрим или запись).

Кстати, изначально ЧатГПТ сам мне предложил содержимое плашки, но оно не было похоже на то, которое я только что описал выше. Он советовал показывать статус стрима «Live» и его название. Мне эта идея не приглянулась. На мой вопрос «Зачем показывать статус стрима, если его потом всё равно многие будут смотреть в записи?» он не нашёлся что ответить.

В общем, с горем пополам определились с содержимым плашки — и чат начал выдавать мне инструкцию.

  • Сначала сделай чёрную полупрозрачную подложку (а должен заметить, что я пользуюсь Виндой и решил спрятать нижний бар с пуском, поиском и прочими иконками; высота бара составляет 48 пикселей, и именно такую высоту я и задал для плашки; естественно, полупрозрачность там была абсолютно не нужна, т.к. я обрезал транслируемый экран на эту высоту);

  • Теперь добавь текстовый блок с твоим именем. Настрой его. Молодец;

  • Теперь добавь текстовый блок с указанием источника стрима.

В этот момент я прерываю чат. Я бы хотел сделать вертикальные разделители между элементами. Куда мне их лучше засунуть? В качестве отдельных элементов или как часть каждого следующего элемента? Чат посоветовал второе.

  • Теперь давай добавим текст про тему стрима. В качестве источника возьмём текстовый файл на твоём компе. Ты сможешь редактировать его и как только сохранишь — текст обновится.

«О, это круто», — подумал я. Но тут увидел, что вертикальные разделители как-то странно висят в воздухе относительно текстов и мне это не понравилось. Поэтому пришлось для каждого разделителя добавлять отдельный элемент сцены.

  • Теперь добавим блок со ссылками. Молодец

  • А теперь часики. Для того, чтобы отображать реальное время мы можем пойти двумя путями:

    • Первый: используем текстовый файл, в котором ты будешь периодически менять время вручную (в этом месте инструкции нужно было видеть моё лицо);

    • Второй: используем такой источник данных как «Браузер» и сделаем html-страничку и небольшой js, который будет автоматически обновлять время.

И я такой в этом моменте: «Чегоооо?».

После этого я спросил: «Я правильно понимаю, что мы можем сверстать любой html, использовать свой css и js — и транслировать это в стрим, даже не открывая браузера?». «Да» — ответил ChatGPT.

И в этот момент я понял, что вся моя предыдущая работа с кучей элементов со своими настройками — полностью перечёркивается.

— А почему же ты мне тогда не предложил сразу сверстать плашку целиком?

— Я не знал, сможешь ли ты разобраться с вёрсткой — и предложил самый простой и быстрый вариант для новичка.

— А зачем мне разбираться с вёрсткой, если ты сам отлично всё можешь верстать, и от тебя потребовалась бы лишь инструкция о том, как мне прикрутить это дело к OBS?

— Да, конечно, ты совершенно прав. Так было бы и правильнее, и быстрее!

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

Через пятнадцать минут всё было готово. Я с помощью чата сверстал три html-ки (для двух мониторов и вебки), связал их с текстовым файлом, в котором мог редактировать тему стрима на лету. Настройки стилей вынес в отдельный файлик. И также создал отдельный файлик для всех скриптов. Проблема висящих разделителей исчезла (как и любая другая проблема, связанная с оформлением). Десять элементов в источниках сцены превратились в один.

Скрипты отвечали за обновление текста, за работу часиков, а также за то, чтобы особенно длинный текст превращался в бегущую строку.

Поделюсь с вами кодом.

Вот overlay для центрального монитора (оверлеи для других сцен — по аналогии):

Это центральный монитор. Тут я показывал, как переношу ручками код из Кодекса в свою IDE
Это центральный монитор. Тут я показывал, как переношу ручками код из Кодекса в свою IDE

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="overlay.css"> </head> <body data-monitor="center"> <div> <div> <span>Егор Камелев</span> <span>|</span> <span> <span id="monitor"></span> </span> <span>|</span> <span id="comment"> <span id="comment-track"> <span id="comment-text-1"></span> <span></span> <span id="comment-text-2"></span> </span> </span> </div> <div> <span>t.me/normfreelancer</span> <span>|</span> <span>normcrm.ru</span> <span>|</span> <span id="clock"></span> </div> </div> <script src="overlay.js"></script> </body> </html>

Вот css (каскадная таблица стилей):

html, body { margin: 0; padding: 0; width: 1920px; height: 48px; overflow: hidden; } * { box-sizing: border-box; } body { font-family: Arial, sans-serif; font-size: 22px; line-height: 1; color: #ffffff; } .header { width: 100%; height: 100%; display: flex; align-items: center; justify-content: space-between; padding: 0 18px; background: linear-gradient( 180deg, rgba(20,20,22,0.96), rgba(10,10,12,0.96) ); overflow: hidden; } .left { display: flex; align-items: center; gap: 14px; min-width: 0; flex: 1 1 auto; white-space: nowrap; overflow: hidden; } .right { display: flex; align-items: center; gap: 14px; flex: 0 0 auto; margin-left: 24px; white-space: nowrap; } .name { font-weight: 600; flex: 0 0 auto; } .monitor { color: #9fd0ff; flex: 0 0 auto; } .comment { position: relative; color: #d5d9df; flex: 1 1 auto; min-width: 0; overflow: hidden; white-space: nowrap; } .comment-track { display: inline-flex; align-items: center; white-space: nowrap; will-change: transform; } .comment.marquee .comment-track { animation: marquee linear infinite; animation-duration: var(--marquee-duration); } .comment-text { white-space: nowrap; flex: 0 0 auto; } .comment-text.clone { display: none; } .comment.marquee .comment-text.clone { display: inline-block; } .comment-gap { width: 80px; flex: 0 0 auto; } .link { color: #7fc1ff; flex: 0 0 auto; } .clock { color: #ffffff; flex: 0 0 auto; } .divider { color: rgba(255, 255, 255, 0.35); flex: 0 0 auto; font-weight: 400; transform: translateY(-1px); } @keyframes marquee { from { transform: translateX(0); } to { transform: translateX(calc(-1 * var(--marquee-shift))); } }

А вот весь js (скрипты):

const monitorType = document.body.dataset.monitor; const monitorText = monitorType === "left" ? "Источник: монитор слева" : monitorType === "webcam" ? "Источник: веб-камера" : "Источник: центральный монитор"; document.getElementById("monitor").textContent = monitorText; let lastCommentText = ""; async function updateComment() { try { const r = await fetch("stream_comment.txt?" + Date.now()); const text = (await r.text()).trim(); if (text === lastCommentText) { return; } lastCommentText = text; const comment = document.getElementById("comment"); const track = document.getElementById("comment-track"); const text1 = document.getElementById("comment-text-1"); const text2 = document.getElementById("comment-text-2"); const gap = comment.querySelector(".comment-gap"); comment.classList.remove("marquee"); track.style.animation = "none"; text1.textContent = text; text2.textContent = text; void track.offsetWidth; const containerWidth = comment.clientWidth; const textWidth = text1.scrollWidth; const gapWidth = gap.offsetWidth; const shift = textWidth + gapWidth; if (textWidth > containerWidth) { const speed = 80; const duration = shift / speed; comment.style.setProperty("--marquee-shift", shift + "px"); comment.style.setProperty("--marquee-duration", duration + "s"); track.style.animation = ""; comment.classList.add("marquee"); } else { comment.style.removeProperty("--marquee-shift"); comment.style.removeProperty("--marquee-duration"); track.style.animation = ""; comment.classList.remove("marquee"); } } catch {} } function updateClock() { const now = new Date(); const h = String(now.getHours()).padStart(2,'0'); const m = String(now.getMinutes()).padStart(2,'0'); const d = String(now.getDate()).padStart(2,'0'); const mo = String(now.getMonth()+1).padStart(2,'0'); const y = now.getFullYear(); document.getElementById("clock").textContent = `${h}:${m} ${d}.${mo}.${y}`; } setInterval(updateClock,1000); setInterval(updateComment,1000); updateClock(); updateComment();

Устанавливается это просто. Создаём папку, кидаем в неё все получившиеся файлы.

Так хранятся файлы, связанные с плашкой
Так хранятся файлы, связанные с плашкой

В самом OBS добавляем на сцену новый источник (выбираем тип «Browser»), указываем нужную html-ку, задаём высоту и ширину — и готово.

Так выглядит выбор источника
Так выглядит выбор источника
Это настройки источника
Это настройки источника

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

В итоге понедельничный стрим прошёл отлично. Я и в Axure поработал, и с ChatGPT пообщался, и в Codex повайбкодил, и в свою IDE потаскал результат, и потестировал, и… Да что там — обыкновенный рабочий процесс. Единственный момент: я кучу времени настраивал себе свет, а перед началом стрима забыл его включить.

А за первым стримом прошло ещё два. И я пока не собираюсь останавливаться (поставил себе цель на 100 стримов либо каждый день, либо кроме выходных, ещё не определился). Сегодня, например, буду писать функциональную спецификацию к НормЦРМ и объяснять, как это делается и, главное, зачем.

А про ChatGPT для себя уяснил одну вещь: есть области, в которых он разбирается хорошо и уверенно (например, разработка в стеке Питон + Джанго). А есть те, в которых общие знания у него есть, но здравого смысла, как эти знания применять эффективно и рационально — нет. Потому что, видимо, не было статей, которые разъясняют, как делать — правильно, а как — не очень.

Если бы я сразу сформулировал задачу как «сверстай HTML-оверлей из таких-то параметров» — сэкономил бы две трети времени.

Ссылки на мои Хабростатьи по теме:

  • 20 лет объяснял программистам, что делать. А теперь попробовал сам

  • 20 лет объяснял программистам, что делать. А теперь попробовал сам. Часть вторая

  • Как я сделал автоматический перевод постов у себя в блоге с помощью ChatGPT

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу crypto.news@mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.

Вам также может быть интересно

Достигнет ли Биткоин беспрецедентных высот?

Достигнет ли Биткоин беспрецедентных высот?

Биткоин (BTC) находится на пороге достижения значительной вехи, стремясь к новому историческому максимуму. При необходимом увеличении всего на 30$, BTC стоит на пороге превышения своего предыдущего рекорда. Продолжить чтение: Поднимется ли Биткоин до беспрецедентных высот?
Поделиться
Coinstats2025/10/05 12:32
Аналитики указали на сокращение L2-сетей в Ethereum

Аналитики указали на сокращение L2-сетей в Ethereum

С июня 2025 года количество Ethereum-решений второго уровня с TVS более $100 000 уменьшилось с 108 до 100, учитывая запуски новых протоколов. На это обратили вн
Поделиться
ProBlockChain2026/03/19 21:48
Кошелек Xaman отправляет предупреждение о безопасности держателям XRP

Кошелек Xaman отправляет предупреждение о безопасности держателям XRP

Безопасность продолжает определять опыт каждого участника криптоэкосистемы. По мере более широкого распространения цифровых активов пользователи все чаще сталкиваются с ответственностью
Поделиться
Timestabloid2026/03/20 01:05