[英]NextJS not working with jsmpeg/node-rtsp-stream. Trying to display RTSP stream
Following: https://github.com/kyriesent/node-rtsp-stream and How to display IP camera feed from an RTSP url onto reactjs app page? 我试图从闭路电视显示 RTSP stream 但它给了我一个错误。 ReferenceError: document is not defined
在scripts\jsmpeg.min.js (1:701) @ eval
中定义
我还没有在 NextJS 中找到这个模块的单个实现,所以我可能做错了什么,但我不知道是什么。 而且我没有为 NextJS 找到更好的解决方案。
没有什么可以让我进入: https://github.com/phoboslab/jsmpeg但我可能在这里用错了。
兔子洞由此开始: How can I display an RTSP video stream in a web page? 但事情要么已经过时,要么不适用,要么我无法弄清楚。
如何解决我得到的错误? NextJS 中是否有替代方法? 我不在乎我需要的只是 stream 来自闭路电视的 RTSP 提要。
components
-layout
-Stream.js
pages
-api
-stream
-[streamId].js
-app.js
-index.js
scripts
-jsmpeg.min.js
Stream.js
是 stream/app.js 中的一个组件, stream/app.js
stream/app.js
用于stream/[streamId].js
Stream.js
import JSMpeg from "../../scripts/jsmpeg.min.js";
const Stream = (props) => {
const player = new JSMpeg.Player("ws://localhost:9999", {
canvas: document.getElementById("video-canvas"), // Canvas should be a canvas DOM element
});
return (
<Fragment>
<canvas
id="video-canvas"
className={classes.canvas}
onMouseDown={onMouseDownHandler}
></canvas>
</Fragment>
);
};
[streamId.js]
export async function getStaticProps(context) {
const StreamCCTV = require("node-rtsp-stream");
const streamCCTV = new StreamCCTV({
ffmpegPath: "C:\\Program Files\\ffmpeg\\bin\\ffmpeg.exe", //! remove on Ubuntu
name: "name",
streamUrl: "rtsp://someuser:somepassword@1.1.1.1",
wsPort: 9999,
ffmpegOptions: {
// options ffmpeg flags
"-stats": "", // an option with no neccessary value uses a blank string
"-r": 30, // options with required values specify the value after the key
},
});
我也尝试过使用https://www.npmjs.com/package/jsmpeg我将Stream.js
更改为:
import jsmpeg from 'jsmpeg';
const Stream = (props) => {
const client = new WebSocket("ws://localhost:9999")
const player = new jsmpeg(client, {
canvas: document.getElementById("video-canvas"), // Canvas should be a canvas DOM element
});
return (
<Fragment>
<canvas
id="video-canvas"
className={classes.canvas}
onMouseDown={onMouseDownHandler}
></canvas>
</Fragment>
);
};
现在的错误是: ReferenceError: window is not defined
jsmpeg 只能播放 mpeg1。 请使用 mpegts 格式的 ffmpeg stream
我设法使用两种解决方案来完成这项工作:
从此处下载jsmpeg.min.js
并将其添加到与您的组件相同的目录(或任何其他所需目录)。
将文件的第一部分从var JSMpeg...
更改为export const JSMpeg...
添加具有以下内容的组件:
import { useRef } from 'react'
const StreamPlayer = () => {
const streamRef = useRef(null)
useEffect(() => {
const { JSMpeg } = require('./jsmpeg.min.js')
const player = new JSMpeg.Player('ws://localhost:9999', {
canvas: streamRef.current
})
}, [])
return <canvas ref={streamRef} id="stream-canvas"></canvas>
}
我不确定在useEffect
中使用require
是否可以,但由于JSMpeg
使用的是document
和window
对象,因此它们必须在加载后导入。\
从这里下载jsmpeg.min.js
并将其添加到 Nextjs 项目的/public
目录中。
添加具有以下内容的组件:
player = new JSMpeg.Player('ws://localhost:9999', {
canvas: document.getElementById('stream-canvas')
})
jsmpeg.min.js
的末尾我添加了: player = new JSMpeg.Player('ws://localhost:9999', { canvas: document.getElementById('stream-canvas') })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.