rtsp rtp 简介
RTSP(Real-Time Streaming Protocol)
RTSP 是一种应用层协议,用于控制音视频流的传输。它类似于 HTTP,但专注于流媒体服务,可实现播放、暂停、停止等操作。RTSP 本身不传输数据,而是控制流媒体会话,通常配合 RTP 使用。
RTP(Real-Time Transport Protocol)
RTP 是一种传输层协议,专用于音视频流数据的传输。它在实时通信中提供时间戳和序列号以保证数据同步和正确顺序,常搭配 UDP 以降低延迟。
关系
- RTSP 负责控制(信令),RTP 负责数据传输。
- 典型使用场景:RTSP 指挥 RTP 流媒体数据的传输,比如 IP 摄像头。
js中如何播放
思路很简单,你这个玩意html的媒体元素video 肯定不能直接播放。先用ffmpeg试一下。OK可以播放。那就把这种方式用node实现,最后打包。优点rtsp传输不会断,流健壮,基本不会出现卡顿异常现象。缺点 需要下载插件 麻烦。
node写个插件/服务
把ffmpeg指令node化
const WebSocket = require("ws");
const { spawn } = require("child_process");
const PORT = 8008;
const wss = new WebSocket.Server({ port: PORT });
console.log(`WebSocket server is running on ws://localhost:${PORT}`);
wss.on("connection", (ws) => {
const rtspUrl = "rtsp://";
const ffmpegProcess = startStream(rtspUrl, ws);
ws.on("close", () => {
console.log("WebSocket client disconnected");
if (ffmpegProcess) {
console.log("Stopping FFmpeg process...");
ffmpegProcess.kill();
}
});
ws.on("error", (err) => {
console.error("WebSocket error:", err);
});
});
function startStream(rtspUrl, ws) {
console.log(`Starting FFmpeg for RTSP stream: ${rtspUrl}`);
const ffmpeg = spawn("ffmpeg", [
"-rtsp_transport", "tcp",
"-i", rtspUrl,
"-f", "flv",
"-vcodec", "copy",
"-an",
"pipe:1",
]);
ffmpeg.stdout.on("data", (data) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(data);
}
});
ffmpeg.stderr.on("data", (data) => {
console.error(`FFmpeg stderr: ${data}`);
});
ffmpeg.on("close", (code) => {
console.log(`FFmpeg process exited with code ${code}`);
});
ffmpeg.on("error", (err) => {
console.error("FFmpeg process failed:", err);
});
return ffmpeg;
}
html播放
在服务器中已转为flv,也可转为MP4
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FLV Player</title>
<script src="https://cdn.jsdelivr.net/npm/flv.js@latest"></script>
</head>
<body>
<h1>rtsp ffmpeg Player</h1>
<video id="videoElement" controls autoplay style="width: 100%; max-width: 600px;"></video>
<script>
if (flvjs.isSupported()) {
const videoElement = document.getElementById("videoElement");
const flvPlayer = flvjs.createPlayer({
type: "flv",
url: "ws://localhost:8008/live.flv"
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
} else {
console.error("FLV.js is not supported in this browser.");
}
</script>
</body>
</html>
打包
将node打包为插件需要ffmpeg.exe,使用pkg打包。插件版本注意ffmpeg位置以及引用。
总结
插件版本比较简单,健壮,但是使用麻烦。后面会更新一版服务端配合通过websocket传送rtp包前端播放。