如何在 DO Droplet 上使用 rtmp 设置节点媒体服务器
How to set-up node-media-server with rtmp on DO Droplet
以下所有文件
我无法在 digital-ocean droplet 上托管我的 RTMP 服务器。
我有 2 个节点应用程序,1 只是一个 API 用 Hapi.js 编写的 运行 端口 8000
第二个是节点媒体服务器应用程序 运行ning 在端口 8888 和 1935 上用于 RTMP,我已将其集成为 Hapi.js 插件,但它们 运行作为单独的过程。
我使用 Nginx 作为反向代理将请求传递给节点应用程序,一切正常。 node-media-server 提供的所有端点都可以工作。
但我想不出一种方法来访问我的节点媒体服务器的 1935 端口并向其发送 RTMP 流。
在本地主机上,我像这样使用 OBS rtmp://localhost:1935/live/{stream_key}
,但这对托管应用程序不起作用。
请告诉我一种从我的 OBS 接收流到服务器的方法。
也许我可以使用 ngix-rtmp 模块来接收流并将其推送到服务器上我的节点媒体服务器应用程序...
/etc/nginx/sites-available/default
upstream media {
server 127.0.0.1:8888;
}
upstream main {
server 127.0.0.1:8000;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html/challenger;
index index.html index.htm index.nginx-debian.html;
server_name hellonode;
location ^~ /assets/ {
gzip_static on;
expires 12h;
add_header Cache-Control public;
}
location /main/ {
proxy_pass http://localhost:8000/;
#proxy_http_version 1.1;
#proxy_set_header Host $http_host;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "Upgrade";
#proxy_set_header X-Real-IP $proxy_protocol_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto tcp;
#proxy_set_header X-NginX-Proxy true;
}
location / {
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://media;
}
}
和节点媒体服务器应用程序(用作 Hapi.js 插件,在 manifest.js
中调用
"use strict";
const { getStreamKeyFromStreamPath } = require("../app/services/live.service");
const NodeMediaServer = require("node-media-server");
const ffmpegPath = require("@ffmpeg-installer/ffmpeg").path;
const connect = {
name: "live",
pkg: require("../../package"),
async register(server, options) {
const config = {
logType: 3,
rtmp: {
port: 1935,
chunk_size: 60000,
gop_cache: true,
ping: 30,
ping_timeout: 60,
},
http: {
port: process.env.MEDIA_SERVER_PORT || 8888,
mediaroot: "./media",
allow_origin: "*",
},
trans: {
// ffmpeg: "../../../ffmpeg/bin/ffmpeg.exe",
ffmpeg: ffmpegPath,
tasks: [
{
app: "live",
hls: true,
hlsFlags: "[hls_time=2:hls_list_size=3:hls_flags=delete_segments]",
mp4: true,
mp4Flags: "[movflags=frag_keyframe+empty_moov]",
},
],
},
};
const nms = new NodeMediaServer(config);
nms.on("prePublish", async (id, StreamPath, args) => {
let stream_key = getStreamKeyFromStreamPath(StreamPath);
console.log(
"[NodeEvent on prePublish]",
`id=${id} StreamPath=${StreamPath} args=${JSON.stringify(args)}`
);
});
nms.run();
},
};
module.exports = connect;
经过一番研究,我得到了解决方案。
解决方案非常明显
因此节点媒体服务器应用程序在端口 1935 上侦听 RTMP。因此自然的解决方案是创建和配置一个防火墙,允许通过端口 1935 进行 TCP 连接。对于 Ubuntu 18.0 Droplet,以下内容技巧。
首先,找到您的 lsof -i :1935
端口,然后允许通过 sudo ufw allow 1935/tcp
端口进行 TCP 连接。因此,如果节点媒体服务器是 运行,恭喜!您现在可以像这样使用 OBS rtmp://your_ip:1935/live/stream_key
请注意:注意运行您的应用程序的主机。对我来说 localhost
有效,但使用一些 Droplet 配置您可能需要将其设置为 0.0.0.0
以下所有文件
我无法在 digital-ocean droplet 上托管我的 RTMP 服务器。 我有 2 个节点应用程序,1 只是一个 API 用 Hapi.js 编写的 运行 端口 8000
第二个是节点媒体服务器应用程序 运行ning 在端口 8888 和 1935 上用于 RTMP,我已将其集成为 Hapi.js 插件,但它们 运行作为单独的过程。 我使用 Nginx 作为反向代理将请求传递给节点应用程序,一切正常。 node-media-server 提供的所有端点都可以工作。
但我想不出一种方法来访问我的节点媒体服务器的 1935 端口并向其发送 RTMP 流。
在本地主机上,我像这样使用 OBS rtmp://localhost:1935/live/{stream_key}
,但这对托管应用程序不起作用。
请告诉我一种从我的 OBS 接收流到服务器的方法。
也许我可以使用 ngix-rtmp 模块来接收流并将其推送到服务器上我的节点媒体服务器应用程序...
/etc/nginx/sites-available/default
upstream media {
server 127.0.0.1:8888;
}
upstream main {
server 127.0.0.1:8000;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html/challenger;
index index.html index.htm index.nginx-debian.html;
server_name hellonode;
location ^~ /assets/ {
gzip_static on;
expires 12h;
add_header Cache-Control public;
}
location /main/ {
proxy_pass http://localhost:8000/;
#proxy_http_version 1.1;
#proxy_set_header Host $http_host;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "Upgrade";
#proxy_set_header X-Real-IP $proxy_protocol_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto tcp;
#proxy_set_header X-NginX-Proxy true;
}
location / {
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://media;
}
}
和节点媒体服务器应用程序(用作 Hapi.js 插件,在 manifest.js
"use strict";
const { getStreamKeyFromStreamPath } = require("../app/services/live.service");
const NodeMediaServer = require("node-media-server");
const ffmpegPath = require("@ffmpeg-installer/ffmpeg").path;
const connect = {
name: "live",
pkg: require("../../package"),
async register(server, options) {
const config = {
logType: 3,
rtmp: {
port: 1935,
chunk_size: 60000,
gop_cache: true,
ping: 30,
ping_timeout: 60,
},
http: {
port: process.env.MEDIA_SERVER_PORT || 8888,
mediaroot: "./media",
allow_origin: "*",
},
trans: {
// ffmpeg: "../../../ffmpeg/bin/ffmpeg.exe",
ffmpeg: ffmpegPath,
tasks: [
{
app: "live",
hls: true,
hlsFlags: "[hls_time=2:hls_list_size=3:hls_flags=delete_segments]",
mp4: true,
mp4Flags: "[movflags=frag_keyframe+empty_moov]",
},
],
},
};
const nms = new NodeMediaServer(config);
nms.on("prePublish", async (id, StreamPath, args) => {
let stream_key = getStreamKeyFromStreamPath(StreamPath);
console.log(
"[NodeEvent on prePublish]",
`id=${id} StreamPath=${StreamPath} args=${JSON.stringify(args)}`
);
});
nms.run();
},
};
module.exports = connect;
经过一番研究,我得到了解决方案。
解决方案非常明显
因此节点媒体服务器应用程序在端口 1935 上侦听 RTMP。因此自然的解决方案是创建和配置一个防火墙,允许通过端口 1935 进行 TCP 连接。对于 Ubuntu 18.0 Droplet,以下内容技巧。
首先,找到您的 lsof -i :1935
端口,然后允许通过 sudo ufw allow 1935/tcp
端口进行 TCP 连接。因此,如果节点媒体服务器是 运行,恭喜!您现在可以像这样使用 OBS rtmp://your_ip:1935/live/stream_key
请注意:注意运行您的应用程序的主机。对我来说 localhost
有效,但使用一些 Droplet 配置您可能需要将其设置为 0.0.0.0