111 lines
3.4 KiB
Markdown
111 lines
3.4 KiB
Markdown
# Unity
|
|
|
|
Software written with the Unity Engine can publish a stream to the server by acting as a [WebRTC client](04-webrtc-clients.md).
|
|
|
|
Create a new Unity project or open an existing one.
|
|
|
|
Open _Window -> Package Manager_, click on the plus sign, _Add Package by name..._ and insert `com.unity.webrtc`. Wait for the package to be installed.
|
|
|
|
In the _Project_ window, under `Assets`, create a new C# Script called `WebRTCPublisher.cs` with this content:
|
|
|
|
```cs
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
using Unity.WebRTC;
|
|
using UnityEngine.Networking;
|
|
|
|
public class WebRTCPublisher : MonoBehaviour
|
|
{
|
|
public string url = "http://localhost:8889/unity/whip";
|
|
public int videoWidth = 1280;
|
|
public int videoHeight = 720;
|
|
|
|
private RTCPeerConnection pc;
|
|
private MediaStream videoStream;
|
|
|
|
void Start()
|
|
{
|
|
pc = new RTCPeerConnection();
|
|
Camera sourceCamera = gameObject.GetComponent<Camera>();
|
|
videoStream = sourceCamera.CaptureStream(videoWidth, videoHeight);
|
|
foreach (var track in videoStream.GetTracks())
|
|
{
|
|
pc.AddTrack(track);
|
|
}
|
|
|
|
StartCoroutine(WebRTC.Update());
|
|
StartCoroutine(createOffer());
|
|
}
|
|
|
|
private IEnumerator createOffer()
|
|
{
|
|
var op = pc.CreateOffer();
|
|
yield return op;
|
|
if (op.IsError) {
|
|
Debug.LogError("CreateOffer() failed");
|
|
yield break;
|
|
}
|
|
|
|
yield return setLocalDescription(op.Desc);
|
|
}
|
|
|
|
private IEnumerator setLocalDescription(RTCSessionDescription offer)
|
|
{
|
|
var op = pc.SetLocalDescription(ref offer);
|
|
yield return op;
|
|
if (op.IsError) {
|
|
Debug.LogError("SetLocalDescription() failed");
|
|
yield break;
|
|
}
|
|
|
|
yield return postOffer(offer);
|
|
}
|
|
|
|
private IEnumerator postOffer(RTCSessionDescription offer)
|
|
{
|
|
var content = new System.Net.Http.StringContent(offer.sdp);
|
|
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/sdp");
|
|
var client = new System.Net.Http.HttpClient();
|
|
|
|
var task = System.Threading.Tasks.Task.Run(async () => {
|
|
var res = await client.PostAsync(new System.UriBuilder(url).Uri, content);
|
|
res.EnsureSuccessStatusCode();
|
|
return await res.Content.ReadAsStringAsync();
|
|
});
|
|
yield return new WaitUntil(() => task.IsCompleted);
|
|
if (task.Exception != null) {
|
|
Debug.LogError(task.Exception);
|
|
yield break;
|
|
}
|
|
|
|
yield return setRemoteDescription(task.Result);
|
|
}
|
|
|
|
private IEnumerator setRemoteDescription(string answer)
|
|
{
|
|
RTCSessionDescription desc = new RTCSessionDescription();
|
|
desc.type = RTCSdpType.Answer;
|
|
desc.sdp = answer;
|
|
var op = pc.SetRemoteDescription(ref desc);
|
|
yield return op;
|
|
if (op.IsError) {
|
|
Debug.LogError("SetRemoteDescription() failed");
|
|
yield break;
|
|
}
|
|
|
|
yield break;
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
pc?.Close();
|
|
pc?.Dispose();
|
|
videoStream?.Dispose();
|
|
}
|
|
}
|
|
```
|
|
|
|
In the _Hierarchy_ window, find or create a scene and a camera, then add the `WebRTCPublisher.cs` script as component of the camera, by dragging it inside the _Inspector_ window. then Press the _Play_ button at the top of the page.
|
|
|
|
The resulting stream will be available on path `/unity`.
|