使用 Node Media Server 从 IP cam 重新流式传输 RTSP 到 http/ws 并用 html 显示

Re-stream RTSP from IP cam with Node Media Server to http/ws and display it with html

目标

我的目标是在标准 HTML 页面上显示我的网络摄像头的 RTSP 输出流(html5 + css3 + vanilla javascript,没有魔法 =没有插件)。 HTML 页面应托管在我的 Raspberry Pi.

上的 NGINX 网络服务器中

我的装备

我使用的设置是 Raspberry Pi 3 B+,带有 Rasbian OS、Node.js 和 Node-Media-Server package、NGINX(但我没有相信 NGINX 对我的问题很重要吗?反正我还没有为其中的 Node-Media-Server 做任何配置。) IP 摄像机和浏览器。

我试过的

Node-Media-Server-project 中的 readme 非常详细,并且有一个教程几乎准确地描述了我想要做什么。具体来说,有一个关于如何访问实时流的标记示例:

<html>

<head>
    <title>Camera</title>
</head>

<body>
    <script src="https://cdn.bootcss.com/flv.js/1.4.0/flv.min.js"></script>
    <video id="videoElement"></video>
    <script>
        if (flvjs.isSupported()) {
            var videoElement = document.getElementById('videoElement');
            var flvPlayer = flvjs.createPlayer({
                type: 'flv',
                url: 'http://localhost:8000/live/uterum.flv'
            });
            flvPlayer.attachMediaElement(videoElement);
            flvPlayer.load();
            flvPlayer.play();
        }
    </script> 
</body>

</html>

这就是我在 Raspberry PI、kommandoran-mediaserver.js:

上启动媒体服务器的方式
const { NodeMediaServer } = require('node-media-server');

const config = {
    logType: 3, // 3 - Log everything (debug)
    rtmp: {
        port: 1935,
        chunk_size: 60000,
        gop_cache: true,
        ping: 60,
        ping_timeout: 30
    },
    http: {
        port: 8000,
        allow_origin: '*'
    },
    relay: {
        ffmpeg: '/usr/local/bin/ffmpeg',
        tasks: [
            {
                app: 'cctv',
                mode: 'static',
                edge: 'rtsp://<USER>:<PASSWORD>@10.0.0.111/live1.sdp',
                name: 'uterum',
                rtsp_transport : 'tcp' //['udp', 'tcp', 'udp_multicast', 'http']
            }
        ]
    }
};

var nms = new NodeMediaServer(config)
nms.run();

我的问题和疑问

当我尝试在 Raspberry Pi(即本地主机)上通过 Chromium 浏览器查看 camera.html(参见上面的标记)时,没有显示任何内容。在 Chromium 调试检查器中没有 javascript 错误,但我得到这个:
GET http://localhost:8000/live/uterum.flv net::ERR_EMPTY_RESPONSE

这是节点终端的截图: 红色区域说明了当我尝试向 http://localhost:8000/live/uterum.flv.

发出请求时的输出

我想我试图到达错误的终点,但哪个是正确的?文档说明 http://localhost:8000/live/STREAM_NAME.flv。在我的例子中,“STREAM_NAME”是什么?

正如您从配置中看到的,您的 RTSP 流被推送到“cctv”应用程序。

所以你的播放地址应该是:

rtmp://localhost/cctv/uterum

http://localhost:8000/cctv/uterum.flv