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>

相关推荐
物极必反102418 小时前
QT使用FFMpeg编译安卓程序.md
qt·ffmpeg·安卓
胡家伟++19 小时前
从一段经文到 5 分半水墨动画短片:全 AI 流水线完整实录(即梦 + TTS 克隆 + ffmpeg + 思维链重构)
人工智能·ffmpeg·aigc
allnlei1 天前
Opus In-Band FEC 详解:原理、实现与开源方案
ffmpeg·音视频·gstreamer
hasty1 天前
只监听本机为何仍需鉴权?Cline Hub 的 WebSocket 信任边界解析
网络·websocket·网络协议
YIAN2 天前
从跨域代理到 WebSocket:梳理前端实时通信的底层逻辑与完整实践
前端·websocket
web打印社区2 天前
远程打印:WebSocket 与 HTTP 轮询怎么选
前端·vue.js·websocket·网络协议·http·electron·pdf
VidDown2 天前
从一堆脚本到能维护的系统:视频处理管道的工程化
服务器·ffmpeg·音视频·视频编解码
FlightYe2 天前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
可乐鸡翅yeah_2 天前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
程序员老陆3 天前
FFmpeg 日志级别深度解析:从 AV_LOG_ERROR 到 AV_LOG_TRACE 的完整指南
ffmpeg·音视频