docs.unity3d.com
    目次を表示する/隠す

    チュートリアル

    WebRTC パッケージの基本的な利用方法について説明します。

    名前空間の追加

    名前空間は Unity.WebRTC を指定します。

    using UnityEngine;
    using Unity.WebRTC;
    

    初期化

    WebRTC の利用時には初期化を行うために、 WebRTC.Initialize()を呼び出します。終了時には WebRTC.Finalize() を呼び出します。

    public class MyPlayerScript : MonoBehaviour
    {
        private void Awake()
        {
            // WebRTC 初期化
            WebRTC.Initialize();
        }
    }
    

    ローカルピアの作成

    ローカルピアを作成し RTCDataChannel を取得します。RTCDataChannel を利用してバイナリデータの送受信を行うことができます。RTCDataChannel の初期化時もしくは終了時に処理を行う場合は、 OnOpen と OnClose のコールバックを登録してください。また、メッセージの受信を行う場合は OnMessage にコールバックを指定します。

        // Create local peer
        var localConnection = new RTCPeerConnection();
        var sendChannel = localConnection.CreateDataChannel("sendChannel");
        channel.OnOpen = handleSendChannelStatusChange;
        channel.OnClose = handleSendChannelStatusChange;
    

    リモートピアの作成

    リモートピアを作成し、OnDataChannel にコールバックを設定します。

        // Create remote peer
        var remoteConnection = new RTCPeerConnection();
        remoteConnection.OnDataChannel = ReceiveChannelCallback;
    

    通信経路候補の登録

    ピアの接続を行うために、ICE (Interactive Connectivity Establishment) の交換が必要になります。各ピアで通信経路候補が発見されたら、 OnIceCandidate が呼び出されます。各ピアのコールバックで AddIceCandidate を呼び出して経路候補の登録を行います。

    localConnection.OnIceCandidate = e => 
    { 
        !string.IsNullOrEmpty(e.candidate) || remoteConnection.AddIceCandidate(e); 
    }
    
    remoteConnection.OnIceCandidate = e => 
    { 
        !string.IsNullOrEmpty(e.candidate) || localConnection.AddIceCandidate(e);
    }
    

    シグナリング処理の流れ

    ピア間で SDP の交換を行います。最初に CreateOffer でオファー SDP を作成します。オファー SDP を取得後、ローカルピアとリモートピアの双方に SDP を設定します。このとき SetLocalDescription と SetRemoteDescription を取り違えないよう気をつけてください。

    オファー SDP の設定が完了したら、 CreateAnswer を呼び出してアンサー SDP を作成します。オファー SDP と同様に、アンサー SDP もローカルピアとリモートピアの双方に設定します。

    var op1 = localConnection.CreateOffer();
    yield return op1;
    var op2 = localConnection.SetLocalDescription(ref op1.desc);
    yield return op2;
    var op3 = remoteConnection.SetRemoteDescription(ref op1.desc);
    yield return op3;
    var op4 = remoteConnection.CreateAnswer();
    yield return op4;
    var op5 = remoteConnection.setLocalDescription(op4.desc);
    yield return op5;
    var op6 = localConnection.setRemoteDescription(op4.desc);
    yield return op6;
    

    ICE の接続状態の確認

    ピア間で SDP の交換を行うと、ICE の交換が開始されます。ICE の接続状態を確認するには OnIceConnectionChange のコールバックを利用します。

    localConnection.OnIceConnectionChange = state => {
        Debug.Log(state);
    }
    

    データチャネルの接続

    ICE の交換が完了すると、OnDataChannel が呼び出され、他方のピアのデータチャネルが生成されます。 OnMessage コールバックを登録して、メッセージ受信時の処理を記述します。

    RTCDataChannel receiveChannel;
    void ReceiveChannelCallback(RTCDataChannel channel) 
    {
        receiveChannel = channel;
        receiveChannel.OnMessage = HandleReceiveMessage;  
    }
    

    メッセージの送信

    ピア双方の RTCDataChannel がオープンすると、メッセージのやり取りが可能になります。送信可能なメッセージの形式は string もしくは byte[] を利用できます。

    void SendMessage(string message)
    {
        sendChannel.Send(message);
    }
    
    void SendBinary(byte[] bytes)
    {
        sendChannel.Send(bytes);
    }
    

    メッセージの受信

    メッセージ受信時には OnMessage に登録したコールバックが呼ばれます。byte[] 形式で取得することができ、文字列として扱う場合は以下のように変換します。

    void HandleReceiveMessage(byte[] bytes)
    {
        var message = System.Text.Encoding.UTF8.GetString(bytes);
        Debug.Log(message);
    }
    

    終了処理

    利用を終了するときには、RTCDataChannelと RTCPeerConnectionのClose()を呼び出す必要があります。最終的に、オブジェクトを破棄したあと WebRTC.Finalize() を呼び出してください。

    private void OnDestroy()
    {
        sendChannel.Close();
        receiveChannel.Close();
    
        localConnection.Close();
        remoteConnection.Close();
    
        WebRTC.Finalize();
    }
    

    オーディオストリーミング

    オーディオストリーミングを利用するためには、 Audio の CaptureStream() から MediaStream を取得します。

    audioStream = Audio.CaptureStream();
    

    オーディオトラックをピアに追加します。後でトラックを破棄するために RTCRtpSender のインスタンスを取得します。

        var senders = new List<RTCRtpSender>();
        foreach (var track in audioStream.GetTracks())
        {
            var sender = localConnection.AddTrack(track);
            senders.Add(sender);
        }
    

    トラックを破棄するため RemoveTrack を呼び出します。

        foreach(var sender in senders)
        {
            localConnection.RemoveTrack(sender);
        }
    

    MonoBehaviour の OnAudioFilterRead で Audio.Update メソッドを呼び出します。

        private void OnAudioFilterRead(float[] data, int channels)
        {
            Audio.Update(data, data.Length);
        }
    
    注記

    OnAudioFilterRead メソッドを利用する場合は、 AudioListener コンポーネントと同じ GameObject に関連付ける必要があります。

    あるいは、AudioRenderer を利用する方法もあります。

    
        private void Start()
        {
            AudioRenderer.Start();
        }
    
        private void Update()
        {
            var sampleCountFrame = AudioRenderer.GetSampleCountForCaptureFrame();
            var channelCount = 2; // AudioSettings.speakerMode == Stereo
            var length = sampleCountFrame * channelCount;
            var buffer = new NativeArray<float>(length, Allocator.Temp);
            AudioRenderer.Render(buffer);
            Audio.Update(buffer.ToArray(), buffer.Length);
            buffer.Dispose();
        }
    

    ビデオストリーミング

    ビデオストリームをキャプチャするために、MediaStream を Camera.CaptureStream() メソッドを使って取得します。

    概要
    • 名前空間の追加
    • 初期化
    • ローカルピアの作成
    • リモートピアの作成
    • 通信経路候補の登録
    • シグナリング処理の流れ
    • ICE の接続状態の確認
    • メッセージの送信
    • メッセージの受信
    • 終了処理
    • オーディオストリーミング
    • ビデオストリーミング
    トップに戻る
    Copyright © 2023 Unity Technologies — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)