lottery
🎉🌟✨🎈年会抽奖程序,基于 Express + Three.js的 3D 球体抽奖程序,奖品🧧🎁,文字,图片,抽奖规则均可配置,😜抽奖人员信息Excel一键导入😍,抽奖结果Excel导出😎,给你的抽奖活动带来全新酷炫体验🚀🚀🚀
A Node.js implementation of RTMP/HTTP-FLV Media Server
Node-Media-Server is a high-performance/low-latency/open-source Live Streaming Server developed based on Nodejs.
v4 is design to implement enhanced RTMP FLV v1 support for native HEVC, VP9, AV1.
v4 is no longer compatible with the cn_cdn extension id flv_265 standard.
v4 is no longer compatible with flashplayer's rtmp protocol.
v4 is incompatible with v2. Do not upgrade across major versions.
npm install node-media-server -g
or run directly
npx node-media-server
Node-Media-Server can provide static file services for a directory.
"static": {
"router": "/",
"root": "./html"
}
Node-Media-Server can record live streams as FLV files.
When the static file server is enabled and recordings are saved in its directory.
It can provide video-on-demand services.
"record": {
"path": "./html/record"
}
http://server_ip:8000/record/live/stream/unix_time.flv
or
https://server_ip:8443/record/live/stream/unix_time.flv
Node-Media-Server v4.2.0 introduces a comprehensive REST API system for server management and monitoring.
The API system uses JWT-based authentication with the following endpoints:
Login is a two-step process that prevents credential replay attacks without requiring HTTPS.
Step 1: Request a challenge
POST /api/v1/login
Content-Type: application/json
{
"username": "your_username"
}
Response:
{
"success": true,
"data": {
"challenge": "a_random_nonce_string"
},
"message": "Challenge issued"
}
Step 2: Submit challenge response
Compute response = HMAC-SHA256(password, challenge) and submit:
POST /api/v1/login
Content-Type: application/json
{
"username": "your_username",
"challenge": "a_random_nonce_string",
"response": "hmac_sha256_hex_digest"
}
Response:
{
"success": true,
"data": {
"token": "your_jwt_token",
"user": {
"username": "your_username"
},
"expiresIn": "24h"
},
"message": "Login successful"
}
Each challenge is single-use and expires after 60 seconds.
Include the JWT token in your requests:
Authorization: Bearer your_jwt_token
GET /api/v1/health
Returns server health status, including CPU usage, memory consumption, and uptime.
GET /api/v1/info
Returns server configuration, version information, and system details.
GET /api/v1/streams
List all active streams with detailed information including codecs, bitrate, and connected clients.
GET /api/v1/sessions
Monitor all connected clients (publishers and players) with session details.
DELETE /api/v1/sessions/{sessionId}
Terminate a specific session by ID. This will disconnect the associated client and stop their stream or playback.
Response:
{
"success": true,
"data": {
"id": "sessionId",
}
"message": "Session deleted successfully",
}
GET /api/v1/stats
Real-time server performance metrics including:
The API system is configured through the bin/config.json file:
"auth": {
"play": false,
"publish": false,
"secret": "nodemedia2017privatekey",
"jwt": {
"expiresIn": "24h",
"refreshExpiresIn": "7d",
"algorithm": "HS256",
"users": [
{
"username": "admin",
"password": "admin123"
}
]
}
},
Login uses a challenge-response protocol (HMAC-SHA256) to prevent credential replay attacks. Passwords never cross the network — even on plain HTTP. Each challenge is single-use and expires after 60 seconds.
# Step 1: Request challenge
CHALLENGE=$(curl -s -X POST http://localhost:8000/api/v1/login \
-H "Content-Type: application/json" \
-d '{"username":"admin"}' | python3 -c "import sys,json;print(json.load(sys.stdin)['data']['challenge'])")
# Step 2: Compute response and login
RESPONSE=$(echo -n "$CHALLENGE" | openssl dgst -sha256 -hmac "your_password" | awk '{print $NF}')
curl -X POST http://localhost:8000/api/v1/login \
-H "Content-Type: application/json" \
-d "{\"username\":\"admin\",\"challenge\":\"$CHALLENGE\",\"response\":\"$RESPONSE\"}"
# Get server stats
curl -X GET http://localhost:8000/api/v1/stats \
-H "Authorization: Bearer your_jwt_token"
# Get active streams
curl -X GET http://localhost:8000/api/v1/streams \
-H "Authorization: Bearer your_jwt_token"
# Get all sessions
curl -X GET http://localhost:8000/api/v1/sessions \
-H "Authorization: Bearer your_jwt_token"
# Delete a specific session
curl -X DELETE http://localhost:8000/api/v1/sessions/abc123-def456-ghi789 \
-H "Authorization: Bearer your_jwt_token"
const crypto = require('crypto');
// Step 1: Request challenge
const challengeRes = await fetch('http://localhost:8000/api/v1/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'admin' })
});
const { data: { challenge } } = await challengeRes.json();
// Step 2: Compute response and login
const response = crypto.createHmac('sha256', 'your_password').update(challenge).digest('hex');
const loginRes = await fetch('http://localhost:8000/api/v1/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'admin', challenge, response })
});
const { data: { token } } = await loginRes.json();
// Get streams
const streamsResponse = await fetch('http://localhost:8000/api/v1/streams', {
headers: { 'Authorization': `Bearer ${token}` }
});
const streams = await streamsResponse.json();
console.log('Active streams:', streams);
// Get all sessions
const sessionsResponse = await fetch('http://localhost:8000/api/v1/sessions', {
headers: { 'Authorization': `Bearer ${token}` }
});
const sessions = await sessionsResponse.json();
console.log('Active sessions:', sessions);
// Delete a specific session
if (sessions.data.length > 0) {
const sessionIdToDelete = sessions.data[0].id;
const deleteResponse = await fetch(`http://localhost:8000/api/v1/sessions/${sessionIdToDelete}`, {
method: 'DELETE',
headers: { 'Authorization': `Bearer ${token}` }
});
const deleteResult = await deleteResponse.json();
console.log('Session deletion result:', deleteResult);
}
| Client | H.264 | HEVC | VP9 | AV1 |
|---|---|---|---|---|
| OBS_29.1+ | ✅ | ✅ | ❌ | ✅ |
| FFmpeg/FFplay_6.1+ | ✅ | ✅ | ✅ | ✅ |
| NodePlayer.js_1.0+ | ✅ | ✅ | ❌ | ❌ |
| NodeMediaClient_3.0+ | ✅ | ✅ | ❌ | ❌ |
Free Android Live Streaming App
Apache 2.0
more like this
🎉🌟✨🎈年会抽奖程序,基于 Express + Three.js的 3D 球体抽奖程序,奖品🧧🎁,文字,图片,抽奖规则均可配置,😜抽奖人员信息Excel一键导入😍,抽奖结果Excel导出😎,给你的抽奖活动带来全新酷炫体验🚀🚀🚀
A synchronized watch party application for Emby media servers. Watch videos together with friends in real-time, no matt…
YiMao · 云海求片助手 — 双核心 Telegram 影视求片机器人。订阅模式:TMDB 智能搜索一键订阅 / 趣味求片模式:AI 生成五层地狱闯关,通关解锁优先求片。深度集成 MoviePilot + Emby/Jellyfin。…
search projects, people, and tags