サーバーに接続する

概要

サーバーへの接続と設定内容について記載します。 サーバーへの接続設定内容については Sora ドキュメント WebSocket 経由のシグナリング も参考にしてください。

接続の手順

サーバーへの接続は次の手順で行います。

  1. SoraMediaChannel.Listener を準備する

  2. SoraMediaOption を準備する

    • 映像と音声の送受信設定を行います。

    • 映像の送信にはキャプチャラー、映像の送受信には EGL コンテキストが必要です。生成方法について 映像の送受信と描画 を参照してください。

  3. SoraMediaChannel を生成し接続する

使用例

// (1) SoraMediaChannel.Listener の実装の準備
private val channelListener = object : SoraMediaChannel.Listener {

  override fun onConnect(mediaChannel: SoraMediaChannel) {
    ...
  }
  // その他の Listener インタフェースの実装
}

fun start() {

  // (2) SoraMediaOption の準備
  val option = SoraMediaOption().apply {
    // 以下ではマルチストリームで、映像と音声を送受信する設定を行なっています。
    // キャプチャラー(capturer)と EGL コンテキスト(eglBaseContext)は別途作成済みの想定です。
    enableAudioDownstream()
    enableVideoDownstream(egl!!.eglBaseContext)

    enableAudioUpstream()
    enableVideoUpstream(capturer!!, egl!!.eglBaseContext)

    enableMultistream()
  }

  // (3) SoraMediaChannel の作成、接続
  mediaChannel = SoraMediaChannel(
    context           = this,
    signalingEndpoint = "wss://sora.example.com/signaling",
    channelId         = "sora",
    mediaOption       = option,
    listener          = channelListener)

  mediaChannel.connect()
}

fun stop() {
  mediaChannel.disconnect()
}

接続時の主な設定内容

SoraMediaOption の主な設定内容

SoraMediaOption の主な設定内容を次に示します。 デフォルトの設定はいずれも無効です。

DataChannel を利用したメッセージングのみで接続する ケースを除き映像、音声の送受信設定が必要です。

  • enableVideoUpstream(): 映像を送信します。引数にキャプチャラーと EGL コンテキストを与えます。

  • enableVideoDownstream(): 映像を受信します。引数に EGL コンテキストを与えます。

  • enableAudioUpstream(): 音声を送信します。

  • enableAudioDownstream(): 音声を受信します。

  • videoCodec: 映像コーデックを指定します。デフォルトは VP9 です。

  • videoBitrate: 映像ビットレートを指定します。

  • videoVp9Params: 映像の VP9 設定を指定します。詳細は 映像コーデックパラメーターの設定 を参照してください。

  • videoAv1Params: 映像の AV1 設定を指定します。詳細は 映像コーデックパラメーターの設定 を参照してください。

  • videoH264Params: 映像の H264 設定を指定します。詳細は 映像コーデックパラメーターの設定 を参照してください。

  • audioCodec: 音声コーデックを指定します。デフォルトは OPUS です。

  • audioBitrate: 音声ビットレートを指定します。

  • enableMultistream(): マルチストリーム機能 を有効にします。

  • enableSimulcast(): サイマルキャスト機能 を有効にします。

  • enableSpotlight(): スポットライト機能 を有効にします。

  • proxy: プロキシ・サーバーの設定 を行います。

  • forwardingFilterOption: 転送フィルター機能 の設定を行います。

  • hardwareVideoEncoderResolutionAdjustment: 解像度の縦横のピクセル数が指定した値の整数倍となるように調整します。デフォルトは 16 です。

SoraMediaChannel の主な設定内容

SoraMediaChannel の主な設定内容を次に示します。

以下の項目は必須で設定する項目です。signalingEndpoint, signalingEndpointCandidates についてはいずれかを設定します。listener は必須ではありませんが、通常アプリケーションでは SDK のイベントを受け取る必要があるため必須としています。

  • context: android.content.Context を設定してください

  • signalingEndpoint: シグナリング URL を指定します。複数指定する場合は signalingEndpointCandidates を使用してください。

  • signalingEndpointCandidates: シグナリング URL を複数指定します。詳細は 複数のシグナリング URL を指定する を参照してください。

  • channelId: 接続するチャネル ID を指定します。

  • mediaOption: SoraMediaOption

  • listener: イベント通知をうけるための SoraMediaChannel.Listener を設定してください。

オプションで以下を設定することが可能です。利用する機能に応じて設定を行います。

  • dataChannelSignaling: DataChannel 経由のシグナリング を有効にします

  • dataChannels: メッセージング機能 利用時に使用します

  • signalingMetadata: 認証時にサーバーに送信する任意のメタデータを指定します。詳細は メタデータの送信 を参照してください。

  • signalingNotifyMetadata: シグナリング通知時に連携される任意のメタデータを指定します。詳細は メタデータの送信 を参照してください。

  • clientId: 接続時に任意に指定可能な ID を指定します。

  • bundleId: マルチストリーム利用時、同一の bundle_id が設定されている別の接続からの音声や映像、メッセージングを受信しなくなります。

role の自動設定について

映像または音声の送受信の設定によりサーバー接続時のロールが自動的に判定されます。 明示的に SoraMediaOption.role に設定することも可能です。 ロールについては Sora ドキュメント ロール の項も参考にしてください。

role が明示的に指定されていない場合は SoraMediaOption への送受信の設定内容から判定されます SoraChannelRole.SENDRECV と判定された場合、マルチストリーム機能 も有効に設定されます

  • 送信と受信両方の設定が行われている : SoraChannelRole.SENDRECV

  • 送信のみの設定が行われている : SoraChannelRole.SENDONLY

  • 受信のみの設定が行われている : SoraChannelRole.RECVONLY

// 以下は映像と音声の送受信を設定しているのでサーバー接続時のロールは SoraChannelRole.SENDRECV となります。
val option = SoraMediaOption().apply {

  enableVideoUpstream(capturer, egl.eglBaseContext)
  enableAudioUpstream()
  enableVideoDownstream()
  enableAudioDownstream()
  ...
}

メタデータの送受信

サーバーとの接続時にメタデータの送信を行うことができます。また、サーバーから接続時、シグナリング通知によりメタデータを受信できます。 関連する箇所に Sora ドキュメント のリンクを記載しますので合わせて参考にしてください。

メタデータの送信

認証時にサーバーに送信する metadata については Sora ドキュメント メタデータ の項を参照してください。

シグナリング通知時に連携されるメタデータ signaling_notify_metadata については シグナリング通知メタデータ を参照してください。

Sora Android SDK では上記の metadatasignaling_notify_metadata を、それぞれ SoraMediaChannelsignalingMetadatasignalingNotifyMetadata に値を設定します。 JSON 形式に変換可能なデータを設定してください。設定したデータは Gson により変換されます。

// 接続して映像を送受信します
// signalingMetadata, signalingNotifyMetadata には JSON 形式に変換可能なデータを設定します
val mediaChannel = SoraMediaChannel(
              context                     = this,
              signalingEndpoint           = "wss://example.com/signaling",
              channelId                   = "sora",
              signalingMetadata           = "abc",
              signalingNotifyMetadata     = mapOf("spam" to "egg"),
              mediaOption                 = option,
              listener                    = channelListener)

mediaChannel.connect()

メタデータの受信

認証サーバーから受信した metadata については Sora ドキュメント "type": "offer" の項を参照してください。 シグナリング通知時に連携されるメタデータについては シグナリング通知メタデータ を参照してください。

Sora Android SDK では上記の metadata 、 シグナリング通知メタデータが、それぞれ SoraMediaChannel.ListeneronOfferMessageonNotificationMessage で通知されます。

// 接続通知を受信するための Listener を宣言します。
private val channelListener = object : SoraMediaChannel.Listener {

  // Sora から type: offer メッセージを受信した際に呼び出されるコールバック
  override fun onOfferMessage(mediaChannel: SoraMediaChannel, offer: OfferMessage) {

    // 認証サーバーから返却された metadata が返却されます
    val offerMetadata = offer.metadata
    ...
  }

  // Sora のシグナリング通知機能の通知を受信したときに呼び出されるコールバック
  override fun onNotificationMessage(mediaChannel: SoraMediaChannel, notification: NotificationMessage) {

    when (notification.eventType) {

      // シグナリング通知に設定された各種 metadata が返却されます
      // 項目の詳細については Sora のドキュメントを参照してください
      // https://sora-doc.shiguredo.jp/SIGNALING_NOTIFY_METADATA
      "connection.created", "connection.destroyed", "connection.updated" -> {

        var signalingNotifyConnectionId  = notification.clientId
        var signalingNotifyAuthMetadata  = notification.authnMetadata
        var signalingNotifyAutzMetadata  = notification.authzMetadata
        var signalingNotifyDataList      = notification.data
      }
    }

  }
  ...
}

DataChannel 経由のシグナリング

DataChannel 経由のシグナリングについては Sora ドキュメント DataChannel 経由のシグナリング を参照してください。

Sora Android SDK で Sora と DataChannel を経由したシグナリング通信を行う場合は SoraMediaChanneldataChannelSignalingtrue を設定します。 デフォルトの設定はいずれも無効です。

ignoreDisconnectWebsocket プロパティに true をセットした場合、 DataChannel への切り替え完了後に Android SDK は WebSocket を切断します。

// 接続して映像を送受信します
// DataChannel 経由のシグナリングを有効にしています
// ignoreDisconnectWebSocket = true にすると DataChannel への切り替え完了後に WebSocket は切断されます
val mediaChannel = SoraMediaChannel(
              context                     = this,
              signalingEndpoint           = "wss://example.com/signaling",
              channelId                   = "sora",
              dataChannelSignaling        = true,
              ignoreDisconnectWebSocket   = true,
              mediaOption                 = option,
              listener                    = channelListener)

mediaChannel.connect()

プロキシ・サーバーの設定

Sora Android SDK はプロキシ・サーバーを経由した通信を行うことができます。

  • HTTP プロキシに対応しています

    • SOCKS プロキシも設定できますが、動作を確認していません

  • HTTP の CONNECT メソッドは HTTPS ではなく HTTP で送信します

  • Proxy-Authorization ヘッダーを利用した Basic 認証に対応しています

  • Android OS の Wi-Fi に設定されたプロキシの項目を参照しません

プロキシ・サーバーの情報は SoraMediaOption.proxy に設定します。

val mediaOption = SoraMediaOption().apply {

...

  proxy.type = ProxyType.HTTPS

  // ホスト名、または IP アドレスを指定します
  proxy.hostname = "proxy.example.com"
  proxy.port = 3128

  // プロキシに認証が設定されている場合は username と password を指定します
  proxy.username = "ham"
  proxy.password = "egg"

  // エージェントの設定は任意です
  // 未設定の場合は、シグナリング・メッセージに含まれる `sora_client` の値が使用されます
  proxy.agent = "spam"

...
}

転送フィルター機能

転送フィルター機能は、Sora 側でクライアントへ転送する音声や映像のパケットをフィルターする機能です。 詳しくは Sora ドキュメントの転送フィルター機能 を参照してください。

この機能は SoraChannelRoleSENDRECV または RECVONLY の場合にのみ利用できます。

フィルターを設定する

サーバー接続時に SoraMediaChannelforwardingFilterOption を設定します。

設定例

以下の例は、自分の接続に対して、以下の条件で映像または音声の受信をブロックします。

  • connection_id が "S8YEN0TSE13JDC2991NG4XZ150" の場合は音声と映像の受信をブロックする、または client_id が "screen-share" の場合は音声の受信をブロックする

SoraMediaChannel(
    ...,
    forwardingFilterOption = SoraForwardingFilterOption(
        action = SoraForwardingFilterOption.Action.BLOCK,
        rules = listOf(
            listOf(
                SoraForwardingFilterOption.Rule(
                    SoraForwardingFilterOption.Rule.Field.CONNECTION_ID,
                    SoraForwardingFilterOption.Rule.Operator.IS_IN,
                    listOf("S8YEN0TSE13JDC2991NG4XZ150")
                )
            ),
            listOf(
                SoraForwardingFilterOption.Rule(
                    SoraForwardingFilterOption.Rule.Field.CLIENT_ID,
                    SoraForwardingFilterOption.Rule.Operator.IS_IN,
                    listOf("screen-share")
                ),
                SoraForwardingFilterOption.Rule(
                    SoraForwardingFilterOption.Rule.Field.KIND,
                    SoraForwardingFilterOption.Rule.Operator.IS_IN,
                    listOf("audio")
                )
            )
        )
    )
)

映像コーデックパラメーターの設定

送信する映像コーデックの設定と合わせて、映像コーデックのパラメータを指定可能です。 この機能は映像を送信する際に利用できます。

指定できる値の内容については以下の Sora ドキュメントを参照してください。

Sora Android SDK では上記の SoraMediaOptionvideoVp9Params, videoAv1Params, videoH264Params に値を設定します。 JSON 形式に変換可能なデータを設定してください。設定したデータは Gson により変換されます。

val mediaOption = SoraMediaOption().apply {

  ...

  // 映像コーデックパラメーターを指定する場合は必ず映像コーデックを指定する必要があります
  // 映像コーデックの設定は VP9 / AV1 / H.264 のいずれか 1 種類のみです
  // 利用しない映像コーデックパラメーターは設定しないでください

  // VP9 の映像コーデックパラメーターを指定する
  videoCodec = SoraVideoOption.Codec.VP9
  videoVp9Params = object {
    var profile_id: Int = 0
  }

  // AV1 の映像コーデックパラメーターを指定する
  // videoCodec = SoraVideoOption.Codec.AV1
  // videoAv1Params = object {
  //   var profile: Int = 0
  // }

  // H.264 の映像コーデックパラメーターを指定する
  // videoCodec = SoraVideoOption.Codec.H264
  // videoH264Params = object {
  //   var profile_level_id: String = "42e034"
  // }

...
© Copyright 2018-2023, Shiguredo Inc. Created using Sphinx 7.2.6