Skip to content

Commit

Permalink
Implement basic http-flv streaming and playback
Browse files Browse the repository at this point in the history
  • Loading branch information
illuspas committed Nov 28, 2024
1 parent c0fd357 commit b6a7c7f
Show file tree
Hide file tree
Showing 23 changed files with 2,390 additions and 3 deletions.
17 changes: 17 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/bin/app.js"
}
]
}
6 changes: 6 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"eslint.format.enable": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "always"
},
}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
# Node-Media-Server v4
# Node-Media-Server v4
6 changes: 6 additions & 0 deletions bin/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import NodeMediaServer from "../src/index.js";
import { createRequire } from "module";
const require = createRequire(import.meta.url);
const config = require("./config.json");
let nms = new NodeMediaServer(config);
nms.run();
19 changes: 19 additions & 0 deletions bin/cert.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDCTCCAfGgAwIBAgIUDuhBPFAjE21AWnSXtyZMrJlHD9MwDQYJKoZIhvcNAQEL
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMTEzMDEyMzkwMFoXDTIzMTIz
MDEyMzkwMFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEAvJtnosjxzqRAF6rkYAryTpKtQHAv635epaL24yGT/eVu
WT/ivatXbRM6diPhYNqv/IeyoFhF/0FxnLrgtwmfOOjRj1nV+vg1R+aXgdSh9Uvz
GKrWz3Vmg9C+r+C9JI5UFDPWe16jWhFIRHyXNLRzO08XW2ony1SBumlXVLcupLk6
IKF859DEk+XHFyeiG1BBfy03nT1n1VB57N/IM2CbyAUVlgqafopGI5LuaSWbsjy2
sCjLKsDUvVtKTqKvRp1gr2nD6kizXIQBCntnYOCZhSlFya+B88ohFpMvMYkeObzo
w76nULR0swMlynTspa1W593hj8nbk9poSj+u1oohuQIDAQABo1MwUTAdBgNVHQ4E
FgQURLU/ybQERbsNtyGijJl7SaGSfXkwHwYDVR0jBBgwFoAURLU/ybQERbsNtyGi
jJl7SaGSfXkwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAHdfn
qlg9YP3P93K7oOVhE9O9gpA+YC6jG7n6bBv4ZjDeWeryZR//mSEVeL66C5Pql/h0
xl1QwxMl8xY/BFhGzqX8v45gMw7RQqk0uWiwjwY9aLQUf3LKYi6ql6bTNEUV1u+3
F0r75ihGWXYR3tD3iUD8VTxqr/Uk5h0Y7ZpTen3z8MsIzEU7VMwnaLfSuTeA3X4r
sY1EieWPkJOLxixq2DVRGkxdV6ql+B1PIGkmsVTPw1qq0OAGLZobYIgoqb1YHKjG
0NC0caiA52iGwfKRhxr9q0fhiO2n4MIIYtfCc7kRyYkN9cyOqeZA/7Woph5I4Yra
rlEctb+urg2V8HbaDw==
-----END CERTIFICATE-----
19 changes: 19 additions & 0 deletions bin/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"rtmp": {
"port": 1935
},
"http": {
"bind": "0.0.0.0",
"port": 8000,
"webroot": "./www",
"mediaroot": "./media",
"allow_origin": "*",
"api": true
},
"https": {
"bind": "0.0.0.0",
"port": 8443,
"key": "./bin/key.pem",
"cert": "./bin/cert.pem"
}
}
28 changes: 28 additions & 0 deletions bin/key.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC8m2eiyPHOpEAX
quRgCvJOkq1AcC/rfl6lovbjIZP95W5ZP+K9q1dtEzp2I+Fg2q/8h7KgWEX/QXGc
uuC3CZ846NGPWdX6+DVH5peB1KH1S/MYqtbPdWaD0L6v4L0kjlQUM9Z7XqNaEUhE
fJc0tHM7TxdbaifLVIG6aVdUty6kuTogoXzn0MST5ccXJ6IbUEF/LTedPWfVUHns
38gzYJvIBRWWCpp+ikYjku5pJZuyPLawKMsqwNS9W0pOoq9GnWCvacPqSLNchAEK
e2dg4JmFKUXJr4HzyiEWky8xiR45vOjDvqdQtHSzAyXKdOylrVbn3eGPyduT2mhK
P67WiiG5AgMBAAECggEADPB7ytsOsoFp6kBtpuR+si2gQuL6I/sJTZjMElIRP/fN
EG9wbq3CHjgVqIRBUpk+Pfd7UEKDbtspCw/LxJLy6v8XXXEphoHKef0pGMhN4jEh
45KDkTu52uznytOCy8QTTZ2EJ0ubWQha1Q6tJaRZoXswHDPrY1OQC4oYP+DKC5U8
D/KIhjm+N8Ep2mBVWYFlv4Jqe6zPL7PHRhROr0QSvcyqM8R/ictDx9Zf8/zrBgwv
Yz8ZnZoMmwjs2/d8JEK0bJMGSyAZVB/pZ7CuNW86GAnht2HUqilfeYYgRAkE5o81
phtqDnYyakB9s6BCju4HOL4JEQ9vX3NTwpV4lVEn5wKBgQDno+S4GZ+3lN2Baz0J
X/qjaVP6qplPxKZtCgoz9jUAbgfmrEL08SIe1xkH/6vLNDNJ0RWW4zmHvopuSWN9
UZpmLvATzLtTvL6PJ0ZWRNiUjgY1a9b08MaiMFuMCdV5vpR385RDnpjAh9azh6sa
WisPG8NpPxlIjKn5/EKyBoI0CwKBgQDQcP5Lu3jyaoSUTy7omunbyrNsLoNTLzaS
vCjh5bpxgBNyF/uOYZX0lKeJraWPh1pptK0kbgmK8D9j9IaPW76zOCYXqDNvHgkE
tEul9M4cyb2C1WvV8IQvd89b5fOHqCRIKSoklAV3nl9vuHOgceiDLVQN1joQHdbA
giE1jaW3ywKBgCexP9oEGgg9LA+nLphSqAIkZE2JuiefDN2WYNUylTZzpEr0rayH
PU+HkDR8rRVu5nL5rvdiDFOkZNgtHy00NH7aAC2EYX0h1I13L2hM98fM5md1CSqD
r6XPH4DJlpj7/Tjotjk4Dfi/zhyJXNpxJPu7yCpas5xo7h92CH+0+c6tAoGAbpBx
IyTHS/caajzySenaQH7t22V0vYweq4jpOqIL2qawKeX0xpqW20x67fnRBygp2kY/
TUKdBzjWtyN+uM5WgmQ3OHc9CSTqbbdhJR+MsRKF1r90WuAgjblEoZ+BJSUYUbqc
IxjtKX01bGJv2txxFBvYKRrIY8IgJq8gBHMlQy8CgYAEVL2frT8esn4OgfCEyGY6
+F3A9HcuFsBW5x+PInDQo+8PTH2RoaZxzmrmw2tqkHWnnwJGBWXSjnGbdVdDEilu
iCM1ujPO2NU/QIcwqfBfm9XBPsh052kfiaN80ma1BpRMFkt0BBA7SQVedRvJgDrj
CR9dq010GBwWSnr7BpEokQ==
-----END PRIVATE KEY-----
25 changes: 25 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import globals from "globals";
import pluginJs from "@eslint/js";
import jsdoc from "eslint-plugin-jsdoc";

/** @type {import('eslint').Linter.Config[]} */
export default [
pluginJs.configs.recommended,
jsdoc.configs["flat/recommended"],
{
languageOptions: { globals: globals.node },
plugins: {
jsdoc,
},
rules: {
"jsdoc/require-returns-description": "off",
"jsdoc/valid-types": "error",
"jsdoc/check-types": "error",
"jsdoc/require-param-description": "off",
"no-unused-vars": "off",
"no-undef": "warn",
"semi": [2, "always"],
"quotes": [2, "double"]
}
},
];
17 changes: 15 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,29 @@
"name": "node-media-server",
"description": "A Node.js implementation of RTMP Server",
"version": "4.0.0",
"type": "module",
"bin": "bin/app.js",
"main": "src/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"dev": "npx eslint;node bin/app.js"
},
"keywords": [
"rtmp",
"flv",
"server"
],
"author": "Chen Mingliang",
"license": "Apache-2.0"
"homepage": "https://github.com/illuspas/Node-Media-Server",
"license": "Apache-2.0",
"devDependencies": {
"@eslint/js": "^9.15.0",
"eslint": "^9.15.0",
"eslint-plugin-jsdoc": "50.6.0",
"globals": "^15.12.0"
},
"dependencies": {
"express": "^4.21.1",
"http2-express-bridge": "^1.0.7",
"nanoid": "^5.0.9"
}
}
1 change: 1 addition & 0 deletions src/core/avcodec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export {};
16 changes: 16 additions & 0 deletions src/core/avpacket.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

export default class AVPacket {
constructor() {
this.codec_id = 0;
this.codec_type = 0;
this.duration = 0;
this.flags = 0;
this.pts = 0;
this.dts = 0;
this.size = 0;
this.offset = 0;

/**@type {Buffer} */
this.data = null;
}
}
53 changes: 53 additions & 0 deletions src/core/logger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//
// Created by Chen Mingliang on 23/12/01.
// illuspas@msn.com
// Copyright (c) 2023 NodeMedia. All rights reserved.
//

// import Pino from "pino";
// export default Pino();


class Logger {
constructor (level = "info") {
this.levels = ["trace", "debug", "info", "warn", "error"];
this.level = this.levels.includes(level) ? level : "info";
}

log (message, logLevel = "info") {
const messageLevel = this.levels.indexOf(logLevel);
const currentLevel = this.levels.indexOf(this.level);

if (messageLevel >= currentLevel) {
console.log(`[${this.getTime()}] [${logLevel.toUpperCase()}] ${message}`);
}
}

getTime () {
const now = new Date();
return now.toLocaleString();
}

trace (message) {
this.log(message, "trace");
}

debug (message) {
this.log(message, "debug");
}

info (message) {
this.log(message, "info");
}

warn (message) {
this.log(message, "warn");
}

error (message) {
this.log(message, "error");
}
}

export default new Logger("debug");

30 changes: 30 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import NodeHttpServer from "./server/http_server.js";
import NodeRtmpServer from "./server/rtmp_server.js";
import { createRequire } from "module";
import logger from "./core/logger.js";

const require = createRequire(import.meta.url);
const Package = require("../package.json");


export default class NodeMediaServer {
constructor(config) {
logger.level = "debug";
logger.info(`Node-Media-Server v${Package.version}`);
logger.info(`Homepage: ${Package.homepage}`);
logger.info(`License: ${Package.license}`);
logger.info(`Author: ${Package.author}`);
this.ctx = {
config,
sessions: new Map(),
broadcasts: new Map()
};
this.httpServer = new NodeHttpServer(this.ctx);
this.rtmpServer = new NodeRtmpServer(this.ctx);
}

run() {
this.httpServer.run();
this.rtmpServer.run();
}
}
Loading

0 comments on commit b6a7c7f

Please sign in to comment.