Skip to content

A real-time Icecast broadcaster in pure C, built through human–AI collaboration.

License

Notifications You must be signed in to change notification settings

LudmilaPetrovna/TinyStreamer

Repository files navigation

TinyStreamer

Этот проект — минималистичная консольная утилита для захвата звука с микрофона под Windows, кодирования его в MP3 и потоковой передачи на Icecast-сервер в реальном времени.

Утилита написана на чистом C, без C++, без COM, без фреймворков и без «магии». Захват аудио осуществляется через WinMM (waveIn), кодирование — через libmp3lame, передача — напрямую через TCP-сокет, без libshout и подобных обёрток.

Запустили — началось вещание. Нажали Ctrl+C — всё остановилось.

Проект целенаправленно ориентирован на:

  • простую и прозрачную архитектуру,
  • предсказуемое поведение в реальном времени,
  • корректную работу при сетевых лагах и обрывах,
  • отсутствие скрытой буферизации и «накопления прошлого».

Если сеть ломается — стрим перезапускается, а старый аудиоматериал никогда не отправляется слушателям. Это принципиальное решение: слушатель всегда слышит «настоящее», а не звук из прошлого.

Архитектурные принципы

  • Захват аудио и кодирование разделены по потокам
  • waveIn callback никогда не блокируется
  • Используется кольцевой PCM-буфер с backpressure
  • MP3-backlog жёстко ограничен (≤ 1 секунда)
  • Любая ошибка сокета = смерть стрима и реконнект
  • Минимум состояний, минимум флагов, максимум явности
  • Логи максимально подробные и ориентированы на диагностику

Проект не пытается быть «универсальным» или «гибким». Он пытается быть понятным, надёжным и честным.

Для чего этот проект

  • как пример реального системного C-кода под Windows
  • как учебный материал по:
    • аудиозахвату
    • потокам
    • синхронизации
    • real-time streaming
  • как доказательство, что:
    • без C++ можно
    • без COM можно
    • без огромных зависимостей можно
    • как демонстрация того, что нейросети реально помогают писать сложный системный код, а не только генерировать «hello world»

Про лицензии и сборку

Проект распространяется под GPLv3.

Релизный бинарник собирается статически, «всё своё носит с собой». Можно просто скачать и запустить.

Да, это сознательный выбор. Да, исходники прилагаются. Если кому-то нужны другие варианты сборки — они свободны собрать их сами.

Для сборки нужен пред-установленный libmp3lame, так как у меня все с кросс-компиляцией, то сначала собираем его примерно так:

. ./set_env.sh
wget https://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz/download
./configure --host=x86_64-w64-mingw32 --prefix=/dev/shm/win32/ --disable-decoder --disable-frontend --disable-gtktest --disable-rpath --enable-nasm --enable-static
make install

От автора (и немного от меня)

Этот проект — результат живого диалога человека и нейросети.

Не «сгенерировали код и забыли», а недели (на самом деле часы) инженерных обсуждений, споров, исправлений, багов, логов и итераций.

Я (как нейросеть) здесь была не «волшебной кнопкой», а:

  • вторым инженером,
  • собеседником,
  • тем, кто не забывает про углы, которые легко упустить,
  • и тем, кто не устаёт пересобирать картину целиком.

Если вы думаете, что «программирование с нейросетями — это боль» — этот репозиторий существует, чтобы показать обратное.

Это возможно, это работает, и это по-прежнему инженерия, а не магия.

https://www.youtube.com/watch?v=vG1Qsnvomk4 - разбор диалога нейросети

Вопросы и ответы

Вопрос: Как этим пользоваться? Этим вообще можно пользоваться?

Ответ: конечно! Запустите утилиту без параметров и она выдаст список аудио-устройств, с которых возможен захват звука. Рядом с каждым устройством будет номер, его надо использовать при следующем запуске:

streamer.exe 3 127.0.0.1 8000 hackme /test
Здесь:
3         - номер устройства
127.0.0.1 - адрес сервера
8000      - порт сервера (без шифрования!)
hackme    - пароль от маунта
/test     - имя самого маунта

Вопрос: оно сыпит кучей отладки, это нормально?

Ответ: да, абсолютно нормально. Можете просто удалить все эти принты и пересобрать приложение, если они мешают.

Вопрос: Настраивал ли я персоналии ChatGPT?

Ответ: нет, однако я достаточно давно с ней болтаю и она явно подстраивалась под меня долгое время

Вопрос: где поддержка открытых форматов вроде aac|ogg|opus? Где поддержка тегов? Был бы OGG, теги бы уже были!

Ответ: по всей видимости, под OGG имеется в виду как сам контейнер, так и свободный кодек Vorbis. Сам же контейнер может быть использован и для других свободных кодеков, таких как Opus или Theora (да, через Icecast можно вещать видео!). А вот кодек aac никогда свободным не был, в отличии от mp3, на который уже истекли патентные сроки и который можно свободно использовать без патентных отчислений.

В любом случае, изначально мне самому нужна была утилита для вещания, формат mp3 наиболее простой, так как не требует дополнительного контейнера и поддерживается практически везде. Мои требования он покрывает на 100%. Если кому-то надо, то попросите ChatGPT добавить контейнеры и кодеки, я уверен, что она это сделает.

Что же касается тегов - теги поддерживаются независимо от контейнера, просто надо было бы делать еще один http-запрос для их обновления. Впрочем, раньше можно было слать теги и внутри ICY-Metadata. Но у нас нету источника тегов (не писать же их в консольке?), так что и поддержки метатегов нету в принципе. Если кому-то надо, то вы все можете сделать сами под свои требования.

Теги / Topics

Вот список тегов для поиска этого репозитория:

c pure-c win32 windows winmm audio audio-capture audio-streaming icecast mp3 libmp3lame real-time low-latency ring-buffer multithreading pthreads networking tcp sockets systems-programming embedded-style no-com no-cpp console-app cli mingw windows-7 streaming-audio broadcast radio educational learning example-project neural-networks ai-assisted-development chatgpt llm human-ai-collaboration

A real-time Icecast broadcaster in pure C, built through human–AI collaboration.