Этот проект — минималистичная консольная утилита для захвата звука с микрофона под 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 - имя самого маунта
Ответ: да, абсолютно нормально. Можете просто удалить все эти принты и пересобрать приложение, если они мешают.
Ответ: нет, однако я достаточно давно с ней болтаю и она явно подстраивалась под меня долгое время
Вопрос: где поддержка открытых форматов вроде aac|ogg|opus? Где поддержка тегов? Был бы OGG, теги бы уже были!
Ответ: по всей видимости, под OGG имеется в виду как сам контейнер, так и свободный кодек Vorbis. Сам же контейнер может быть использован и для других свободных кодеков, таких как Opus или Theora (да, через Icecast можно вещать видео!). А вот кодек aac никогда свободным не был, в отличии от mp3, на который уже истекли патентные сроки и который можно свободно использовать без патентных отчислений.
В любом случае, изначально мне самому нужна была утилита для вещания, формат mp3 наиболее простой, так как не требует дополнительного контейнера и поддерживается практически везде. Мои требования он покрывает на 100%. Если кому-то надо, то попросите ChatGPT добавить контейнеры и кодеки, я уверен, что она это сделает.
Что же касается тегов - теги поддерживаются независимо от контейнера, просто надо было бы делать еще один http-запрос для их обновления. Впрочем, раньше можно было слать теги и внутри ICY-Metadata. Но у нас нету источника тегов (не писать же их в консольке?), так что и поддержки метатегов нету в принципе. Если кому-то надо, то вы все можете сделать сами под свои требования.
Вот список тегов для поиска этого репозитория:
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.