0.1.26 • Published 8 months ago

@feige0629/unity-render-streaming v0.1.26

Weekly downloads
-
License
-
Repository
-
Last release
8 months ago

@feige0629/unity-render-streaming 使用

本包只是React客户端,需要配合 定制的 webserver 服务端进行使用

Tips:需要React客户端源码+本客户端定制的服务端源码,可加微信,备注来意

微信:feige0629

说明

Unity Render Streaming是Unity官方推出的一套云渲染解决方案,可以实现将我们打包的.exe程序运行于服务器云端,在浏览器、移动端进行显示,该解决方案基于Google开发的WebRTC流技术,以及Unity官方推出的新的输入系统Input System来实现,主要用于三端通信,客户端(本React端为客户端)、服务器端、 unity.exe程序。

渲染后示例图片

1、安装

npm install @feige0629/unity-render-streaming

yarn add @feige0629/unity-render-streaming

2、本包封装了2个React组件

// 1、这是从 Unity 接收视频/音频的示例。可以结合BroadcastUnity Render Streaming的场景使用。
<Receiver websocketUrl= 'ws://127.0.0.1:7000' autoPlay={true} style={{width:600, height:400}} /> 
// 2、这是一个示例,用于接收在 Unity 上渲染的相机图像。您可以通过浏览器在 Unity 中操作相机。可以结合WebBrowserInputUnity Render Streaming的场景使用。WebApp 必须在公共模式下运行。
<Videoplayer websocketUrl= 'ws://127.0.0.1:7000' autoPlay={true} style={{width:600, height:400}} /> 

3、Videoplayer Demo 使用方法

import { useRef, useState } from 'react';
import '../App.css'
import { Videoplayer, VideoplayerRef } from '../webserver';

function VideoDemo() 
{
  const receiverRef = useRef<VideoplayerRef>(null);
  const [autoPlay, setAutoPlay] = useState<boolean>(true); //是否自动播放

  // 播放视频
  const playButton = ()=>{
    receiverRef.current!.playVideo();
    setAutoPlay(true);
  }

  // 加载完成
  const onComplate = (videoRef: HTMLVideoElement, videoPlayer: any) => {
    console.log('加载完成:',videoRef, videoPlayer);
  }
  
  return (
    <div id="container">
      <h1>VideoPlayer Sample</h1>
      <div id="video-container">
        <Videoplayer ref={receiverRef} websocketUrl= 'ws://127.0.0.1:5173/video' onComplate={onComplate} autoPlay={autoPlay} style={{width:600, height:400}} />
        {
          !autoPlay && 
          <div id="player">
            <button id="playButton" onClick={playButton}>播放</button>
          </div>
        }
      </div>
    </div>
  );
}

export default VideoDemo;

4、Receiver Demo 使用方法

import { useRef, useState } from 'react';
import '../App.css'
import { Receiver, ReceiverRef } from '../webserver';

function ReceiverDemo() 
{
  const receiverRef = useRef<ReceiverRef>(null);
  const [autoPlay, setAutoPlay] = useState<boolean>(true); //是否自动播放
  const [show, setShow] = useState<boolean>(false);
  const [websocketUrl, setWebsocketUrl] = useState<string>('ws://127.0.0.1:5173/ws');

  // 播放视频
  const playButton = ()=>{
    receiverRef.current!.playVideo();
    setAutoPlay(true);
  }

  // 发送消息
  const sendMessageButton = ()=>{
    receiverRef.current!.sendMessage(JSON.stringify({"MessageType":"1", "Content":"测试数据"}));
  }
  
  // 监听消息
  const onMessage = (msg:MessageEvent) => {
    console.log(`Receive Msg:`, msg.data, msg);
  }

  // 加载完成
  const onComplate = (videoRef: HTMLVideoElement, videoPlayer: any, renderstreaming: any) => {
    setShow(true);
    console.log('加载完成:',videoRef, videoPlayer, renderstreaming);
  }

  // 结束链接
  const onDisconnect = ()=>{
    console.log('结束');
  }

  return (
    <div id="container">
      <h1>Receiver Sample - {show ? '加载成功' : '启动中...'}</h1>
      <div id="video-container">
        <Receiver ref={receiverRef} config={{
          iceServers : [
            {
              urls: ['turn:xxx.xxx.xx.xx:3478?transport=udp'],
              username: 'admin',
              credential: '123456'
            }
          ]
        }} onMessage={onMessage} websocketUrl={websocketUrl} onDisconnect={onDisconnect} onComplate={onComplate} autoPlay={autoPlay} style={{width:600, height:400}} />
        {
          !autoPlay && 
          <div id="player">
            <button id="playButton" onClick={playButton}>播放</button>
          </div>
        }
      </div>
      { autoPlay && <button id="sendButton" onClick={sendMessageButton}>发送数据</button> }
      <button id="sendButton" onClick={()=>setWebsocketUrl('ws://127.0.0.1:5173/ws')}>本地websocketUrl</button>
      <button id="sendButton" onClick={()=>setWebsocketUrl('ws://127.0.0.1:5173/fwq')}>服务器websocketUrl</button>
    </div>
  );
}

export default ReceiverDemo;

5、API

参数说明类型默认值适用组件
autoPlay自动播放booleantrueReceiver, Videoplayer
style自定义样式CSSProperties-Receiver, Videoplayer
classNameclassName属性string-Receiver, Videoplayer
config配置{ logging?: string; startupMode?: string; useWebSocket?: boolean; sdpSemantics?: string; iceServers?: { key:number:{ urls: string[], username?: string, credential?: string } }[]; }{ logging: "dev", startupMode: "public", useWebSocket: true, sdpSemantics:'unified-pla', iceServers : [{ urls: 'stun:stun.l.google.com:19302' }],username: 'admin', credential: '123456' }Receiver, Videoplayer
websocketUrlwebsocket协议地址, config.useWebSocket为true启用stringlocation.protocol === "https:" ? "wss://" + location.host : "ws://" + location.hostReceiver, Videoplayer
signalingOriginsignaling协议地址, config.useWebSocket为false启用stringlocation.originReceiver, Videoplayer
onMessage监听服务器端消息(msg: MessageEvent) => void-Receiver
onStatsMessage监听video状态数据(msg: statsType[]) => void-Receiver
onComplate加载完成,renderstreaming只在Receiver组件返回(videoRef: HTMLVideoElement, videoPlayer: any, renderstreaming: any) => void-Receiver, Videoplayer
onDisconnect关闭回调--Receiver, Videoplayer

6、方法

名称描述适用组件
sendMessage发送消息(message: string)Receiver
playVideo播放视频Receiver, Videoplayer
disconnect调用关闭Receiver, Videoplayer

7、外网服务器部署

对于大多数 WebRTC 应用,服务器都需要在对等设备之间中继流量,因为在客户端之间通常无法实现直接套接字(除非这些应用在同一个本地网络中)。解决此问题的常见方法是使用TURN 服务器。术语表示使用中继 NAT 的遍历,是一种中继网络流量的协议。

参考Unity文档中TURN 服务器设置

https://docs.unity3d.com/Packages/com.unity.renderstreaming@3.1/manual/turnserver.html

TURN服务器使用的端口需要公开,可设置最大最小值

协议端口
TCP32355-65535、3478-3479
UDP32355-65535、3478-3479
0.1.23

10 months ago

0.1.24

10 months ago

0.1.25

10 months ago

0.1.26

8 months ago

0.1.22

11 months ago

0.1.21

11 months ago

0.1.20

11 months ago

0.1.19

11 months ago

0.1.18

11 months ago

0.1.17

11 months ago

0.1.15

11 months ago

0.1.14

11 months ago

0.1.13

11 months ago

0.1.12

11 months ago

0.1.11

11 months ago

0.1.10

11 months ago

0.1.9

11 months ago

0.1.8

11 months ago

0.1.7

11 months ago

0.1.6

11 months ago

0.1.5

11 months ago

0.1.4

11 months ago

0.1.3

11 months ago

0.1.2

11 months ago

0.1.1

11 months ago

0.1.0

11 months ago