Mpegts.js+FFmpeg+WebSocket+Node实时视频流实现方案

nodejs调用ffmpeg录屏推流到websocket地址,网页端调用mpegts.js播放视频流.

执行步骤:

1, node server.js

2, 浏览器打开test.html

server.js

const { spawn } = require('child_process');

const WebSocket = require('ws');

const express = require('express');

const http = require('http');

// 创建 WebSocket 服务器

//const wss = new WebSocket.Server({ port: 8080 });

const app = express();

const server = http.createServer(app);

const wss = new WebSocket.Server({ server });

wss.on('connection', (ws) => {

console.log('Client connected');

// 启动 FFmpeg 进程

const ffmpeg = spawn('ffmpeg', [

//'-rtsp_transport', 'udp', // 使用 TCP 传输 RTSP 流(如果 UDP 不稳定)

//'-f', 'x11grab', linux

'-f', 'gdigrab',

//'-s', '1920x1080', // 分辨率 linux

//'-i', ':0.0+0,00', //linux

'-i', 'desktop', //

'-f', 'mpegts', // 输出格式为 MPEG-TS

'-c:v', 'libx264', // 使用 MPEG-1 编码

'-s', '1920x1080', // 分辨率

'-preset', 'ultrafast',

'-tune', 'zerolatency',

//'-b:v', '800k', // 视频比特率

'-bf', '0', // 禁用 B 帧

'-an', // 禁用音频

'pipe:1' // 输出到标准输出

]);

// 将 FFmpeg 的输出发送到 WebSocket 客户端

ffmpeg.stdout.on('data', (data) => {

if (ws.readyState === ws.OPEN) {

ws.send(data); // 发送二进制数据

}

});

// 处理 FFmpeg 的错误输出

ffmpeg.stderr.on('data', (data) => {

console.error(`FFmpeg error: ${data}`);

});

// 处理 FFmpeg 进程退出

ffmpeg.on('close', (code) => {

console.log(`FFmpeg process exited with code ${code}`);

});

// 客户端断开连接时关闭 FFmpeg 进程

ws.on('close', () => {

console.log('Client disconnected');

ffmpeg.kill(); // 杀死 FFmpeg 进程

});

});

server.listen(80, () => {

console.log('HTTP & WebSocket server is running on ws://localhost:80');

}

);

test.html

<!DOCTYPE html>

<html>

<head>

<title>H264流播放</title>

<script src="mpegts.js"></script>

</head>

<body>

<video id="videoPlayer" controls autoplay muted style="width: 100%; max-width: 1280px;"></video>

<script>

const videoDom = document.getElementById('videoPlayer');

if (mpegts.getFeatureList().mseLivePlayback) {

const player = mpegts.createPlayer({

type: 'mpegts', // 告知解码器这是 MPEG2-TS 格式citation:10

isLive: true, // 开启实时流模式

url: 'ws://127.0.0.1:80' // 需保持与FFmpeg推送地址一致

},{

liveBufferLatencyChasing: true,

liveBufferLatencyMaxLatency: 1.5,

liveBufferLatencyMinRemain: 0.5

}

);

player.attachMediaElement(videoDom);

player.load();

player.play();

} else {

console.error("当前浏览器不支持mpegts.js解码");

}

</script>

</body>

</html>

相关推荐
可乐鸡翅yeah_15 小时前
多浏览器 HLS 兼容性差异排查,Chrome、Firefox、Safari 表现不一致定位
chrome·ffmpeg·音视频·firefox·safari·m3u8
烟雨江南78515 小时前
呼叫中心如何用语音识别做客服质检?从人工抽检到全量通话分析的落地方案
人工智能·websocket·音视频·语音识别·ai客服
脉动数据行情11 天前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#
烟雨江南7851 天前
200路并发语音识别系统实践:CPU、GPU与国产昇腾三种部署方案怎么选?
人工智能·websocket·音视频·语音识别·ai客服
用户59362865610331 天前
Socket.IO 从入门到原理:一份新手也能看懂的完整笔记
websocket
DreamLife☼1 天前
Agent开发环境搭建完全指南
python·docker·typescript·node·工业知识点
行者-全栈开发2 天前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
TickDB2 天前
Python 接入 A 股盘前集合竞价数据:AkShare 报错到 TickDB 实测的完整解法
python·websocket·行情数据 api
幸运小圣2 天前
SSE 与 WebSocket 新手入门:前端实时通信完全指南【JavaScript】
前端·javascript·websocket
可乐鸡翅yeah_2 天前
M3U8测试流使用指南,流媒体开发自测与环境校验标准化方案
网络·ffmpeg·音视频·m3u8·m3u8在线·音视频在线播放