{"id":13692230,"url":"https://github.com/inveta/peer-stream","last_synced_at":"2025-05-02T19:31:43.658Z","repository":{"id":38244380,"uuid":"331295198","full_name":"inveta/peer-stream","owner":"inveta","description":"Lightweight WebRTC SDK  for UnrealEngine's PixelStreaming","archived":false,"fork":false,"pushed_at":"2024-08-25T16:55:09.000Z","size":442,"stargazers_count":401,"open_issues_count":45,"forks_count":107,"subscribers_count":10,"default_branch":"main","last_synced_at":"2024-11-12T18:39:04.755Z","etag":null,"topics":["pixel","realtime","stream","unreal","video","webrtc"],"latest_commit_sha":null,"homepage":"https://inveta.cn","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/inveta.png","metadata":{"files":{"readme":"README-zh.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-01-20T12:08:00.000Z","updated_at":"2024-11-05T05:53:46.000Z","dependencies_parsed_at":"2023-11-06T03:31:23.747Z","dependency_job_id":"e36971e4-9f33-4b76-ae0c-c146a568184c","html_url":"https://github.com/inveta/peer-stream","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inveta%2Fpeer-stream","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inveta%2Fpeer-stream/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inveta%2Fpeer-stream/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inveta%2Fpeer-stream/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inveta","download_url":"https://codeload.github.com/inveta/peer-stream/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252095264,"owners_count":21693887,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pixel","realtime","stream","unreal","video","webrtc"],"created_at":"2024-08-02T17:00:55.017Z","updated_at":"2025-05-02T19:31:43.391Z","avatar_url":"https://github.com/inveta.png","language":"JavaScript","funding_links":[],"categories":["Miscellaneous"],"sub_categories":["Tool"],"readme":"# 虚幻引擎 UE5 像素流 [中文](README-zh.md) [English](README.md)\n\n和官方臃肿不堪的像素流SDK相比，我们在官方的基础上做了大量的优化和精简，并加入了许多新功能，开发出了轻量、零依赖、开箱即用的软件套装，前端的peer-stream.js基于WebComponentsAPI，后端signal.js基于NodeJS和npm/ws。\n\n | 文件名         | 大小  | 作用                             |\n | -------------- | ----- | -------------------------------- |\n | signal.js      | 16 KB | 信令服务器入口文件，通过node启动 |\n | peer-stream.js | 22 KB | 浏览器SDK，一键开启。            |\n | signal.json    | 1 KB  | signal.js 的启动参数。           |\n | signal.html    | 30+KB | 在线 GUI 配置页面。              |\n\n# PeerStream企业版\n团队另外推出了企业版，可以帮助大家更好的使用像素流，欢迎试用。 \n软件可以免费使用，我们会一直维护，源码需要联系微信 g0415shenw  \nhttps://github.com/inveta/PeerStreamEnterprise\n\n## 示例\n\n```s\n# 启动信令服务器，读取配置signal.json\nnode signal.js\n\n# 启动 UE5\nstart path/to/UE5.exe -PixelStreamingURL=\"ws://localhost:88\"\n\n# 打开测试网页\nstart http://localhost:88/signal.html\n```\n\n## signal.js 信令服务器\n\n- 文件体积 15KB。\n- 读取signal.json配置。\n- 提供http文件服务，和WebSocket共享端口号。\n- 面向前端和面向UE5的端口号绑定，通过WebSocket子协议区分。\n- 通过环境变量统一传参，支持命令行或配置文件。\n- 提供HTTP Basic用户名密码认证服务。\n- 支持多个UE5连接。\n- 控制台实时打印UE5和前端的多对多映射关系。\n- 对WebSocket连接做节流过滤，提高稳定性。\n- 支持UE5和前端一一映射。\n- 前端连入时，可以自动启动UE5进程。\n- 多个UE5连入时，负载均衡。\n- 支持stun公网穿透，在公网间互连。\n- 控制台可调式系统命令。\n- 定时发送心跳连接保活。\n- 前端的端口号与ID绑定。\n- 即时打印当前上下文路径，方便查找文件。\n- 自动嗅探网络IP地址。\n- 向下兼容UE4。\n- 支持Windows和Linux下的开机自启动。\n  \n### signal.json 启动参数\n\n| 参数          | 类型       | 默认值 | 功能                             |\n| ------------- | ---------- | ------ | -------------------------------- |\n| PORT          | 正整数     | 88     | WebSocket/HTTP 全局统一端口号    |\n| UE5           | 命令行列表 | []     | UE5自启动脚本池                  |\n| one2one       | 开关       | false  | 限制UE5和前端一一映射            |\n| auth          | 字符串     | ''     | HTTP Basic 认证的 \"用户名:密码\"  |\n| boot          | 开关       | false  | 是否随开机启动signal.js          |\n| exeUeCoolTime | 正整数     | 60     | 下次再启动同一个UE实例的时间间隔 |\n| preload       | 正整数     | 1      | 预启动UE实例的个数               |\n| iceServers    | 列表       | []     | 跨公网连接所需                   |\n| comment       | 字符串     | ''     | 备注                             |\n\n### 负载均衡与UE5自启动\n\n```mermaid\nflowchart TD;\n    subgraph  \n        player([前端连入]);\n        manual([手动启动])\n    end\n\n    subgraph   \n        finish([结束]);\n        match([匹配]);\n    end\n\n    subgraph  \n        claim[寻找空闲前端];\n        start --UE5 连入--\u003e claim;\n        idle --有--\u003e match;\n        start --启动失败--\u003e finish;\n        map121 --关--\u003e min ---\u003e match;  \n       \n        map121[一一映射 ?];\n        start(((启动 UE5)));\n        idle[寻找空闲进程];\n        min[寻找最小负载];\n    \n        idle --无--\u003e start;\n        player -- 有 UE5 进程 --\u003e map121;\n        map121 --开--\u003e idle; \n        player -- 无 UE5 进程 --\u003e start;\n       \n        claim --成功--\u003e match;\n        claim --404--\u003e finish;\n\n        manual  --命令行--\u003e start;\n    end\n```\n\n## 虚幻引擎\n\n启动插件，并在编辑器中测试:\n\n```s\nPlugins \u003e Built-In \u003e Graphics \u003e Pixel Streaming \u003e Enabled\nEditor Preferences \u003e Level Editor \u003e Play \u003e Additional Launch Parameters\nstart path/to/UE5.exe -{key}={value}\n```\n\n常用的启动选项:\n\n| 参数                        | 类型 | 功能                         |\n| --------------------------- | ---- | ---------------------------- |\n| -PixelStreamingURL=\"\"       | URL* | 连接signal.js的WebSocket地址 |\n| -RenderOffScreen            | void | 后台渲染UE                   |\n| -Unattended                 | void | 忽略错误弹窗                 |\n| -GraphicsAdapter=0          | +int | 指定GPU                      |\n| -ResX=1280 -ResY=720        | px²  | 渲染分辨率，搭配-ForceRes    |\n| -PixelStreamingWebRTCFps=30 | fps  | 渲染帧率                     |\n| -AudioMixer                 | void | 传输音频                     |\n\n## peer-stream.js 前端开发包\n\n- 文件22KB。\n- 基于 Web Components API 组件化video标签。\n- 断线自动重连。\n- DOM生命周期绑定：挂载自动连接，卸载自动断开。\n- 支持stun公网穿透。\n- 全局挂载一份引用方便调试：window.ps。\n- 支持5种键盘/鼠标/触屏输入模式。\n- 支持视频自动播放。\n- video标签的id即信令服务器地址，默认指向网页的域名。\n- 支持异步请求。（不稳定）\n\n### 引入\n\n纯HTML写法:\n\n```html\n\u003cscript src=\"peer-stream.js\"\u003e\u003c/script\u003e\n\u003cvideo is=\"peer-stream\" id=\"ws://127.0.0.1:88/\" autoplay muted\u003e\u003c/video\u003e\n```\n\n或者使用JavaScript:\n\n```html\n\u003cscript type=\"module\"\u003e\nimport \"peer-stream.js\";\nconst ps = document.createElement(\"video\", { is: \"peer-stream\" });\nps.id = \"ws://127.0.0.1:88/\";\ndocument.body.append(ps);\n\u003c/script\u003e\n```\n\n### 字符串消息收发\n\n发送消息:\n\n```js\n// 若传入对象，会被JSON化\nps.emitMessage(msg: string | object);\n```\n\n接收消息:\n\n```js\nps.addEventListener(\"message\", e =\u003e {\n    // JSON.parse(e.detail)\n});\n```\n\n异步请求：\n\n```js\nresponse = await ps.emitMessage(request);\n// 返回不稳定\n```\n\n### video事件监听\n\n```js\n// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#events\nps.addEventListener('事件名称', e =\u003e {\n    // 回调函数\n});\n```\n\n- \"message\":\t接收应用层返回消息：e.detail。\n- \"playing\":\t场景开始渲染时，在该事件之后才能安全发送ps.emitMessage()。\n- \"suspend\":\t三维停止渲染时。\n- \"resize\":\tvideo元素被拉伸时。\n- \"pointerlockchange\":\t沉浸式鼠标切换时。\n- \"playerqueue\":\t返回用户排队情况，seq表示当前排队序号  \n- \"playerdisconnected\":\tsignal不在线的回调事件 \n- \"ueDisConnected\":\tue实例异常断开的的回调事件，企业版会触发这个事件[UE异常断线事件](https://github.com/inveta/PeerStreamEnterprise/wiki/05-UE%E5%BC%82%E5%B8%B8%E6%96%AD%E7%BA%BF%E4%BA%8B%E4%BB%B6)  \n\n## signal.html 配置页面\n\n- 文件体积 30+KB。\n- 在线预览：https://inveta.github.io/peer-stream/signal.html#signal.json\n- 在线可视化配置signal.json，实时生效。\n- 端口号与信令共享。\n- 在线预览peer-stream.js视频流。\n- 后台进程监控。\n- 实时监控所有用户和UE进程。\n- 支持在线用户剔除。\n\n## IOS端Safari兼容\n\n由于IOS端Safari不支持自定义内置元素（customized built-in element），需要在peer-stream.js之前引入兼容包：https://github.com/ungap/custom-elements 。除此之外，IOS微信内置浏览器（小程序）禁止video自动播放，必须由用户行为（点击）触发调用ps.play()来播放视频流。\n\n## 更新记录\n1 2024-07-21 增加了对webrtc协议支持的检测，并进行提示  \n2 2024-07-26 解决了输入IP地址访问 检测webrtc失败的bug  \n3 2024-07-26 增加了ueDisConnected，便与应用层进行重连  \n4 2024-08-05 增加了像素流中文的支持，需要配合企业版使用  \n5 2024-08-10 增加了用户鼠标多久不操作就释放三维资源，需要配合企业版使用  \n6 2024-08-26 增加了获取像素流网络带宽和网络质量功能，需要配合企业版使用  ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finveta%2Fpeer-stream","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finveta%2Fpeer-stream","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finveta%2Fpeer-stream/lists"}