feat: initial release — SRT Streamer v1.0.0

Cross-platform Electron + React + FFmpeg desktop app for sending
multiple SRT streams simultaneously.

Features:
- Multiple simultaneous SRT output streams
- Video sources: desktop, window capture, cameras, capture cards
- Audio sources: microphones, system loopback, sound cards
- H.264 encoding with HW acceleration (NVENC/QSV/AMF/VideoToolbox)
- SRT modes: caller / listener / rendezvous
- Frame profile presets (4K, 1080p, 720p, 480p, 360p)
- Tolbek SRT receiver with configurable mode
- System tray: minimize-to-tray, exit confirmation dialog
- Portable build via electron-builder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
admin
2026-04-16 00:37:40 +03:00
commit 1f7dbc2a7d
25 changed files with 10548 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
/**
* Creates minimal placeholder PNG icons without any dependencies.
* Run: node assets/create-placeholder-icons.js
*/
const fs = require('fs')
const path = require('path')
// Minimal valid 16x16 PNG (dark blue background)
function createSimplePng(size) {
// Use a canvas-like approach with raw PNG data
// This creates a simple colored square PNG
const { createCanvas } = (() => {
try { return require('canvas') } catch { return null }
})() || {}
if (createCanvas) {
const canvas = createCanvas(size, size)
const ctx = canvas.getContext('2d')
// Background
ctx.fillStyle = '#1a1a2e'
const r = size * 0.19
ctx.beginPath()
ctx.moveTo(r, 0)
ctx.lineTo(size - r, 0)
ctx.quadraticCurveTo(size, 0, size, r)
ctx.lineTo(size, size - r)
ctx.quadraticCurveTo(size, size, size - r, size)
ctx.lineTo(r, size)
ctx.quadraticCurveTo(0, size, 0, size - r)
ctx.lineTo(0, r)
ctx.quadraticCurveTo(0, 0, r, 0)
ctx.closePath()
ctx.fill()
// Play triangle
const cx = size / 2, cy = size / 2
const s = size * 0.3
ctx.fillStyle = '#4f8ef7'
ctx.beginPath()
ctx.moveTo(cx - s * 0.5, cy - s * 0.6)
ctx.lineTo(cx + s * 0.7, cy)
ctx.lineTo(cx - s * 0.5, cy + s * 0.6)
ctx.closePath()
ctx.fill()
// Red dot
ctx.fillStyle = '#ef4444'
ctx.beginPath()
ctx.arc(size * 0.75, size * 0.25, size * 0.1, 0, Math.PI * 2)
ctx.fill()
return canvas.toBuffer('image/png')
}
// Fallback: minimal 1x1 PNG
return Buffer.from(
'89504e470d0a1a0a0000000d4948445200000001000000010802000000' +
'9001' + '2e00000000c4944415408d7626060600000000200014fd7181000000049454e44ae426082', 'hex'
)
}
const sizes = [
{ name: 'icon.png', size: 512 },
{ name: 'tray-icon.png', size: 32 }
]
for (const { name, size } of sizes) {
const buf = createSimplePng(size)
fs.writeFileSync(path.join(__dirname, name), buf)
console.log(`Created ${name}`)
}