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>

相关推荐
源之缘-OFD先行者3 天前
破界渲染:WinForm下的FFmpeg+Vortice极速推流引擎
ffmpeg·winform·推流·h264
源来猿往3 天前
记ffmpeg-8.1.1 之Android库编译(window)
android·ffmpeg
七夜zippoe3 天前
DolphinDB WebSocket接入:实时数据流
网络·websocket·网络协议·dolphindb·实时数据流
于先生吖3 天前
从零搭建Java萌宠社交系统:WebSocket实时聊天+动态发布模块实现
java·开发语言·websocket
Deitymoon3 天前
RV1126+FFMPEG多路码流监控项目
ffmpeg·音视频
芝麻别开门3 天前
GStreamer DASH Demux 知识文档
ffmpeg·dash
ltlovezh4 天前
ROI 编码学习指南:Android 与 FFmpeg 的真实实现边界
android·ffmpeg·音视频开发
Zhan8611244 天前
WebSocket心跳与断线重连实战:芬兰赫尔辛基指数行情数据接口接入记录
网络·websocket·网络协议
m0_747124535 天前
多媒体框架 FFmpeg 和 GStreamer
ffmpeg·gstreamer
colofullove5 天前
实时游玩页与 WebSocket 状态管理实现
websocket·网络协议·状态模式