A server for relaying RTMP streams with SRT output support, WHIP (WebRTC-HTTP Ingest Protocol) support, and a web management interface.
- 📥 Accepts RTMP, SRT, and WHIP streams
- 📤 Relays to RTMP and SRT outputs
- 💾 Writes streams to FLV files
- 🌐 Web management interface
- 🔧 Dynamic management of inputs and outputs (add/remove/force reconnect without restart)
- 🔄 Universal fallback for RTMP output from SRT (automatic PID detection by content, robust to missing PMT/PAT, supports any PID)
- 📊 Status and statistics monitoring
- ⚙️ SRT parameter configuration
- 🔄 Automatic reconnection and manual force reconnect
- 📥 Minimize to tray option (desktop GUI mode)
The application can run in either standard console (headless) mode or as a standalone desktop app with a WebView2 GUI (on Windows).
- Build the server:
go build -o rtmpserver.exe .- Run the server:
./rtmpserver.exe(If config.yaml is missing in the executable's directory, a default one will be automatically generated upon launch).
- Open the web interface in your browser:
http://localhost:8080
To build a single compact executable without a console window that starts directly with the GUI control panel:
- Make sure GCC (MinGW-w64) is installed in your system (e.g. via MSYS2).
- Run build script (which builds both console and GUI versions, restricting GUI compiling to x64):
.\build.cmdOr compile manually:
go build -tags gui -ldflags "-w -s -H=windowsgui" -o rtmpserver-gui.exe .- Run
rtmpserver-gui.exe. It will open a native desktop window. Close the window to safely stop all streaming servers.
- Login: admin
- Password: secret
- Overall status of all inputs and outputs
- Bitrate and uptime statistics
- Activity indicators
- Add new RTMP inputs
- Remove existing inputs
- View input list
- Add outputs (RTMP/SRT)
- Remove outputs
- Force reconnect
- SRT parameter management
- Global SRT settings (latency, passphrase, streamid)
- Logs & UI (logging configuration, optional minimize to tray)
- Reconnect interval
GET /api/inputs- list inputs- Example request:
curl -u admin:secret http://localhost:8080/api/inputs
- Example request:
POST /api/inputs/add- add input- Example request:
curl -u admin:secret -X POST http://localhost:8080/api/inputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url_path":"/live/stream","outputs":["rtmp://...","srt://..."]}'
- Example request:
GET /api/inputs/remove?name=...- remove input- Example request:
curl -u admin:secret "http://localhost:8080/api/inputs/remove?name=obs"
- Example request:
POST /api/inputs/update_outputs- update outputs for input- Example request:
curl -u admin:secret -X POST http://localhost:8080/api/inputs/update_outputs \ -H 'Content-Type: application/json' \ -d '{"name":"obs","outputs":["rtmp://...","srt://..."]}'
- Example request:
GET /api/status/all- status of all inputs- Example request:
curl -u admin:secret http://localhost:8080/api/status/all
- Example request:
GET /api/status?name=...- status of a specific input- Example request:
curl -u admin:secret "http://localhost:8080/api/status?name=obs"
- Example request:
POST /api/outputs/add- add output- Example request:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
- Example request:
POST /api/outputs/remove- remove output- Example request:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/remove \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
- Example request:
POST /api/outputs/reconnect- force reconnect output- Example request:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/reconnect \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
- Example request:
GET /api/settings- get settings- Example request:
curl -u admin:secret http://localhost:8080/api/settings
- Example request:
PUT /api/settings- update settings- Example request:
curl -u admin:secret -X PUT http://localhost:8080/api/settings \ -H 'Content-Type: application/json' \ -d '{"srt_settings":{"latency":200},"log_to_file":true,"log_file":"server.log","reconnect_interval":5,"minimize_to_tray":true}'
- Example request:
POST /api/settings/reload- reload from file- Example request:
curl -u admin:secret -X POST http://localhost:8080/api/settings/reload
- Example request:
Main settings are stored in config.yaml:
server:
port: 8080
rtmp_port: 1935
api_username: admin
api_password: secret
srt_settings:
latency: 120
connect_timeout: 5000
passphrase: ""
streamid: ""
encryption: "none"
log_to_file: true
log_file: "server.log"
reconnect_interval: 5
minimize_to_tray: false
whip_settings:
ice_servers:
- "stun:stun.l.google.com:19302"
# Example of inputs
# You can also add/remove them via the web interface
inputs:
- name: obs_stream
url_path: /live/obs
outputs:
- rtmp://a.rtmp.youtube.com/live2
- srt://some.srt.server:9000
- file://records/my_stream.flvThe server can start with an empty inputs list, and they can be added later via the web interface or API.
go project/
├── main.go # Main server file
├── api.go # API handlers
├── config.go # Configuration
├── stream_manager.go # Stream management
├── publish_handler.go # RTMP handling
├── srt_server.go # SRT handling
├── config.yaml # Configuration file
├── web/ # Web interface
│ ├── index.html # Main page
│ └── app.js # JavaScript logic
└── README.md # Documentation
-
Add input:
- Go to the "Inputs" tab
- Enter name and RTMP path
- Add outputs (optional)
- Click "Add input"
-
Add output:
- Go to the "Outputs" tab
- Select input
- Enter output URL (RTMP or SRT)
- Click "Add output"
-
Force reconnect output:
- On the "Outputs" tab, use the "Reconnect" button next to the desired output
- Or call the API
/api/outputs/reconnectwith the required parameters
-
Monitoring:
- Go to the "Status" tab
- Track input and output activity
- View bitrate statistics
-
Settings:
- Go to the "Settings" tab
- Change SRT parameters
- Configure logging
- Save changes
- RTMP (rtmp://server/app/stream)
- SRT (srt://server:port/streamId)
- RTMP (rtmp://server/app/stream)
- SRT (srt://server:port?streamid=...)
- File recording:
.mp4(fragmented MP4 via ffmpeg, zero CPU load, crash-resilient).flv/.ts(raw stream saving)
- OBS/ffmpeg can send SRT to your server:
srt://your-server:9000?streamid=obs- Add this as an input in the web UI or config.
- API example:
curl -u admin:secret -X POST http://localhost:8080/api/inputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url_path":"/live/stream","outputs":["rtmp://...","srt://..."]}'
- You can add SRT output for any input:
srt://destination-server:port?streamid=yourstream- Add via web UI or API:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"srt://destination-server:9000?streamid=yourstream"}'
- Make sure your encoder (OBS/ffmpeg) sends keyframes at least every 1-2 seconds (set Keyframe Interval = 2s in OBS).
- If using SRT input, the server will wait for the first keyframe before starting RTMP output.
- If you see a long delay before video appears, check your VPN/proxy and try disabling it.
- This is normal for public RTMP/CDN platforms (VK, YouTube, etc.).
- Try disabling VPN, lowering SRT latency in config (but not below 60-80 ms), and setting Keyframe Interval = 1-2s in OBS.
- For ultra-low latency, use SRT or WebRTC end-to-end (not possible with public CDN).
- Check that your input stream contains both audio and video tracks.
- The server supports even "broken" TS streams (missing PMT/PAT, arbitrary PIDs) thanks to universal fallback.
- Check your network stability and CDN health.
- If you see "RTMP Output buffer full" in logs, increase the output buffer size in the code.
- Исправлено в версии 1.2+: добавлена нормализация временных меток для SRT выходов
- Если видите ошибки типа "Could not convert timestamp 1198778360812 for faad" - обновите сервер
- Нормализация временных меток происходит относительно первого ключевого кадра
- Проверьте логи на наличие "SRT base time set to: [время]" для подтверждения работы
The server automatically detects video/audio PIDs by content, even if the incoming SRT/TS stream is missing PMT/PAT tables or uses non-standard PIDs. This ensures maximum compatibility with streams from OBS, ffmpeg, hardware encoders, and other sources.
Проект поддерживает приём WebRTC-потоков по протоколу WHIP (endpoint: /whip/{name}).
- При подключении клиента по WHIP сервер создаёт отдельный процесс ffmpeg.
- ffmpeg получает медиа-поток по WebRTC (SDP) и преобразует его в стандартный поток (FLV), который далее обрабатывается системой.
- После этого поток автоматически направляется на все выходы, указанные в конфиге для данного input (RTMP, SRT, запись в файл и т.д.).
- Для каждого входа создаётся отдельный ffmpeg-процесс, что обеспечивает изоляцию и стабильность обработки.
Схема работы:
flowchart LR
subgraph Input
A[WHIP Client<br/>WebRTC]
end
subgraph Server
B[WHIP Endpoint<br/>/whip/name]
C[ffmpeg<br/>SDP to FLV]
D[StreamManager]
end
subgraph Outputs
E[RTMP]
F[SRT]
G[File FLV]
end
A -->|SDP/Media| B
B -->|SDP| C
C -->|FLV Packets| D
D --> E
D --> F
D --> G
To use WHIP or record streams in MP4 format, ffmpeg must be installed. The server automatically searches for ffmpeg in your system PATH.
How to get ffmpeg without building it yourself:
- Windows: Download a pre-built package (e.g.,
ffmpeg-git-essentials.7z) from gyan.dev and extractffmpeg.exeinto thebin/folder inside the server directory:go project/ ├── bin/ │ └── ffmpeg.exe └── ... - macOS: Install via Homebrew (
brew install ffmpeg). - Linux: Install via package manager (
sudo apt install ffmpegorsudo pacman -S ffmpeg).
(The custom build options below are optional and only needed if you want to compile a minimal custom binary yourself)
--prefix=/mingw64
--disable-everything
--enable-protocol='pipe,rtmp,file'
--enable-demuxer=rtp
--enable-decoder=opus
--enable-muxer=flv
--enable-encoder=libfdk_aac
--enable-network
--enable-gpl
--enable-nonfree
--enable-libfdk-aac
--enable-small
--disable-doc
--disable-ffplay
--disable-ffprobe
--disable-postproc
--disable-avdevice
--disable-swscale
--disable-debug
--enable-swresample
--disable-shared
--enable-static
--extra-cflags=-static
--extra-ldflags=-static
--pkg-config-flags=--static
--enable-filter='aformat,anull,atrim,aresample'
--enable-parser=h264
--enable-demuxer=h264
--enable-bsfs
--enable-bsf=h264_mp4toannexb
--enable-bsf=extract_extradata
POST /whip/obs_whip HTTP/1.1
Content-Type: application/sdp
v=0
...
Поток будет автоматически обработан и направлен на все выходы, указанные в конфиге для данного input.
Сервер для ретрансляции RTMP-потоков с поддержкой SRT-выходов и веб-интерфейсом управления.
- 📥 Прием RTMP, SRT и WHIP потоков
- 📤 Ретрансляция в RTMP и SRT
- 💾 Запись потоков в FLV-файлы
- 🌐 Веб-интерфейс управления
- 🔧 Динамическое управление входами и выходами (добавление/удаление/force reconnect без рестарта)
- 🔄 Универсальный fallback для RTMP-выхода из SRT (автоматическое определение PID по содержимому, устойчивость к отсутствию PMT/PAT, поддержка любых PID)
- 📊 Мониторинг статуса и статистики
- ⚙️ Настройка параметров SRT
- 🔄 Автоматическое переподключение и ручной force reconnect
- 📥 Опция сворачивания в системный трей (в десктопном GUI режиме)
Приложение может работать как в стандартном консольном (headless) режиме, так и в виде отдельного десктопного GUI-приложения для Windows (на базе WebView2).
- Скомпилируйте сервер:
go build -o rtmpserver.exe .- Запустите сервер:
.\rtmpserver.exe(Если в папке с исполняемым файлом отсутствует config.yaml, программа автоматически создаст его со стандартными параметрами при старте).
- Откройте веб-интерфейс в браузере:
http://localhost:8080
Для сборки единого компактного исполняемого файла, запускающегося без окна консоли и сразу открывающего панель управления:
- Убедитесь, что в системе установлен компилятор GCC (например, через MSYS2).
- Запустите скрипт сборки (он соберет как консольные версии, так и GUI-версию под x64):
.\build.cmdИли скомпилируйте вручную:
go build -tags gui -ldflags "-w -s -H=windowsgui" -o rtmpserver-gui.exe .- Запустите
rtmpserver-gui.exe. Закрытие графического окна безопасно остановит все стриминг-серверы и завершит процесс.
- Логин: admin
- Пароль: secret
- Общий статус всех входов и выходов
- Статистика битрейта и аптайма
- Индикаторы активности
- Добавление новых RTMP-входов
- Удаление существующих входов
- Просмотр списка входов
- Добавление выходов (RTMP/SRT)
- Удаление выходов
- Принудительный реконнект (force reconnect)
- Управление параметрами SRT
- Глобальные настройки SRT (latency, passphrase, streamid)
- Логи и интерфейс (настройка файлов логов, опция сворачивания в трей)
- Reconnect interval переподключения
GET /api/inputs- список входов- Пример запроса:
curl -u admin:secret http://localhost:8080/api/inputs
- Пример запроса:
POST /api/inputs/add- добавить вход- Пример запроса:
curl -u admin:secret -X POST http://localhost:8080/api/inputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url_path":"/live/stream","outputs":["rtmp://...","srt://..."]}'
- Пример запроса:
GET /api/inputs/remove?name=...- удалить вход- Пример запроса:
curl -u admin:secret "http://localhost:8080/api/inputs/remove?name=obs"
- Пример запроса:
POST /api/inputs/update_outputs- обновить выходы для входа- Пример запроса:
curl -u admin:secret -X POST http://localhost:8080/api/inputs/update_outputs \ -H 'Content-Type: application/json' \ -d '{"name":"obs","outputs":["rtmp://...","srt://..."]}'
- Пример запроса:
GET /api/status/all- статус всех входов- Пример запроса:
curl -u admin:secret http://localhost:8080/api/status/all
- Пример запроса:
GET /api/status?name=...- статус конкретного входа- Пример запроса:
curl -u admin:secret "http://localhost:8080/api/status?name=obs"
- Пример запроса:
POST /api/outputs/add- добавить выход- Пример запроса:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
- Пример запроса:
POST /api/outputs/remove- удалить выход- Пример запроса:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/remove \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
- Пример запроса:
POST /api/outputs/reconnect- принудительный реконнект выхода- Пример запроса:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/reconnect \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
- Пример запроса:
GET /api/settings- получить настройки- Пример запроса:
curl -u admin:secret http://localhost:8080/api/settings
- Пример запроса:
PUT /api/settings- обновить настройки- Пример запроса:
curl -u admin:secret -X PUT http://localhost:8080/api/settings \ -H 'Content-Type: application/json' \ -d '{"srt_settings":{"latency":200},"log_to_file":true,"log_file":"server.log","reconnect_interval":5,"minimize_to_tray":true}'
- Пример запроса:
POST /api/settings/reload- перезагрузить из файла- Пример запроса:
curl -u admin:secret -X POST http://localhost:8080/api/settings/reload
- Пример запроса:
Основные настройки хранятся в config.yaml:
server:
port: 8080
rtmp_port: 1935
api_username: admin
api_password: secret
srt_settings:
latency: 120
connect_timeout: 5000
passphrase: ""
streamid: ""
encryption: "none"
log_to_file: true
log_file: "server.log"
reconnect_interval: 5
minimize_to_tray: false
whip_settings:
ice_servers:
- "stun:stun.l.google.com:19302"
# Example of inputs
# You can also add/remove them via the web interface
inputs:
- name: obs_stream
url_path: /live/obs
outputs:
- rtmp://a.rtmp.youtube.com/live2
- srt://some.srt.server:9000
- file://records/my_stream.flvThe server can start with an empty inputs list, and they can be added later via the web interface or API.
go project/
├── main.go # Главный файл сервера
├── api.go # API обработчики
├── config.go # Конфигурация
├── stream_manager.go # Управление потоками
├── publish_handler.go # Обработка RTMP
├── srt_server.go # Обработка SRT
├── config.yaml # Конфигурационный файл
├── web/ # Веб-интерфейс
│ ├── index.html # Главная страница
│ └── app.js # JavaScript логика
└── README.md # Документация
-
Добавление входа:
- Перейдите на вкладку "Входы"
- Введите имя и путь RTMP
- Добавьте выходы (опционально)
- Нажмите "Добавить вход"
-
Добавление выхода:
- Перейдите на вкладку "Выходы"
- Выберите вход
- Введите URL выхода (RTMP или SRT)
- Нажмите "Добавить выход"
-
Force reconnect выхода:
- На вкладке "Выходы" используйте кнопку "Переподключить" рядом с нужным выходом
- Или вызовите API
/api/outputs/reconnectс нужными параметрами
-
Мониторинг:
- Перейдите на вкладку "Статус"
- Отслеживайте активность входов и выходов
- Просматривайте статистику битрейта
-
Настройки:
- Перейдите на вкладку "Настройки"
- Измените параметры SRT
- Настройте логирование
- Сохраните изменения
- RTMP (rtmp://server/app/stream)
- SRT (srt://server:port/streamId)
- RTMP (rtmp://server/app/stream)
- SRT (srt://server:port?streamid=...)
- Запись в файл:
.mp4(фрагментированный MP4 через ffmpeg, без нагрузки на CPU, устойчив к сбоям).flv/.ts(сохранение сырого потока)
- OBS/ffmpeg может отправлять SRT на ваш сервер:
srt://your-server:9000?streamid=obs- Добавьте этот вход через web-интерфейс или в конфиге.
- Пример запроса в API:
curl -u admin:secret -X POST http://localhost:8080/api/inputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url_path":"/live/stream","outputs":["rtmp://...","srt://..."]}'
- Можно добавить SRT-выход для любого входа:
srt://destination-server:port?streamid=yourstream- Через web-интерфейс или API:
curl -u admin:secret -X POST http://localhost:8080/api/outputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"srt://destination-server:9000?streamid=yourstream"}'
- Убедитесь, что ваш энкодер (OBS/ffmpeg) отправляет ключевые кадры не реже, чем раз в 1-2 секунды (Keyframe Interval = 2s в OBS).
- При SRT-входе сервер ждет первый ключевой кадр для старта RTMP-выхода.
- Если видео появляется с задержкой, проверьте VPN/прокси и попробуйте отключить их.
- Это норма для публичных RTMP/CDN платформ (VK, YouTube и др.).
- Отключите VPN, уменьшите latency SRT в конфиге (но не ниже 60-80 мс), выставьте Keyframe Interval = 1-2s в OBS.
- Для ультранизкой задержки используйте SRT или WebRTC напрямую (на публичных CDN это невозможно).
- Проверьте, что во входящем потоке есть и аудио, и видео дорожки.
- Сервер поддерживает даже "кривые" TS-потоки (без PMT/PAT, с любыми PID) благодаря универсальному fallback.
- Проверьте стабильность сети и работу CDN.
- Если в логах есть "RTMP Output buffer full" — увеличьте размер буфера в коде.
- Исправлено в версии 1.2+: добавлена нормализация временных меток для SRT выходов
- Если видите ошибки типа "Could not convert timestamp 1198778360812 for faad" - обновите сервер
- Нормализация временных меток происходит относительно первого ключевого кадра
- Проверьте логи на наличие "SRT base time set to: [время]" для подтверждения работы
Сервер автоматически определяет PID видео/аудио по содержимому даже если во входящем SRT/TS потоке отсутствуют таблицы PMT/PAT или используются нестандартные PID. Это обеспечивает максимальную совместимость с потоками из OBS, ffmpeg, аппаратных энкодеров и других источников.
GET /api/inputs— list inputscurl -u admin:secret http://localhost:8080/api/inputs
POST /api/inputs/add— add inputcurl -u admin:secret -X POST http://localhost:8080/api/inputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url_path":"/live/stream","outputs":["rtmp://...","srt://..."]}'
GET /api/inputs/remove?name=...— remove inputcurl -u admin:secret "http://localhost:8080/api/inputs/remove?name=obs"POST /api/inputs/update_outputs— update outputs for inputcurl -u admin:secret -X POST http://localhost:8080/api/inputs/update_outputs \ -H 'Content-Type: application/json' \ -d '{"name":"obs","outputs":["rtmp://...","srt://..."]}'
GET /api/status/all— status of all inputscurl -u admin:secret http://localhost:8080/api/status/all
GET /api/status?name=...— status of a specific inputcurl -u admin:secret "http://localhost:8080/api/status?name=obs"
POST /api/outputs/add— add outputcurl -u admin:secret -X POST http://localhost:8080/api/outputs/add \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
POST /api/outputs/remove— remove outputcurl -u admin:secret -X POST http://localhost:8080/api/outputs/remove \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
POST /api/outputs/reconnect— force reconnect outputcurl -u admin:secret -X POST http://localhost:8080/api/outputs/reconnect \ -H 'Content-Type: application/json' \ -d '{"name":"obs","url":"rtmp://example.com/live/stream"}'
GET /api/settings— get settingscurl -u admin:secret http://localhost:8080/api/settings
PUT /api/settings— update settingscurl -u admin:secret -X PUT http://localhost:8080/api/settings \ -H 'Content-Type: application/json' \ -d '{"srt_settings":{"latency":200},"log_to_file":true,"log_file":"server.log","reconnect_interval":5,"minimize_to_tray":true}'
POST /api/settings/reload— reload from filecurl -u admin:secret -X POST http://localhost:8080/api/settings/reload
Важно: Для работы WHIP и записи видео в формате MP4 требуется наличие утилиты
ffmpegв системе. Программа автоматически ищетffmpegв глобальных системных путях (переменная окруженияPATH).Как установить готовый ffmpeg без ручной сборки:
Windows: скачайте готовую сборку (например,
ffmpeg-git-essentials.7z) с сайта gyan.dev и распакуйте файлffmpeg.exeв подпапкуbinвнутри директории с программой:go project/ ├── bin/ │ └── ffmpeg.exe └── ...macOS: установите через Homebrew (
brew install ffmpeg).Linux: установите стандартный пакет через ваш менеджер пакетов (
sudo apt install ffmpegилиsudo pacman -S ffmpeg).(Указанные ниже опции сборки требуются только если вы хотите собрать максимально легковесный бинарник вручную)
This project uses a custom fork of datarhei/joy4 with fixes for TS muxer issues that cause video freezing after ~5-6 minutes of streaming.
- ✅ Individual continuity counters - eliminates TS discontinuity errors
- ✅ Proper PCR timing - prevents PCR timestamp wraparound issues
- ✅ Periodic PAT/PMT sending - maintains stream synchronization
- ✅ Simple timestamp conversion - avoids complex 90kHz clock issues
- ✅ Buffer management improvements - prevents stream corruption
# Clone the repository
git clone https://github.com/kirpicheff/rtmp-srt-server.git
cd rtmp-srt-server
# The project already includes the fixed joy4 fork
# Just build normally:
go build -o rtmpserver.exe .# Clone the repository
git clone https://github.com/kirpicheff/rtmp-srt-server.git
cd rtmp-srt-server
# Edit go.mod to use the GitHub fork:
# Replace this line:
# replace github.com/datarhei/joy4 => ./joy4
# With:
# replace github.com/datarhei/joy4 => github.com/kirpicheff/joy4 v0.1.0-ts-fixes
# Then build:
go build -o rtmpserver.exe .- Repository: kirpicheff/joy4
- Branch:
ts-muxer-fixes - Tag:
v0.1.0-ts-fixes - Commit:
cc69ce4b46da- "Fix TS muxer: individual continuity counters, proper PCR timing, periodic PAT/PMT"
The original datarhei/joy4 TS muxer had issues with:
- Video freezing after ~5-6 minutes of streaming
- TS discontinuity errors in VLC
- PCR timestamp wraparound problems
- Buffer management issues
These fixes resolve all known TS muxing issues for stable long-term streaming.