MediaChannel

public final class MediaChannel
extension MediaChannel: CustomStringConvertible

一度接続を行ったメディアチャネルは再利用できません。 同じ設定で接続を行いたい場合は、新しい接続を行う必要があります。

接続が解除されるタイミング

メディアチャネルの接続が解除される条件を以下に示します。 いずれかの条件が 1 つでも成立すると、メディアチャネルを含めたすべてのチャネル (シグナリングチャネル、ピアチャネル、 WebSocket チャネル) の接続が解除されます。

  • シグナリングチャネル (SignalingChannel) の接続が解除される。
  • WebSocket チャネル (WebSocketChannel) の接続が解除される。
  • ピアチャネル (PeerChannel) の接続が解除される。
  • サーバーから受信したシグナリング ping に対して pong を返さない。 これはピアチャネルの役目です。

イベントハンドラ

接続情報

  • クライアントの設定

    Declaration

    Swift

    public let configuration: Configuration
  • 最初に type: connect メッセージを送信した URL (デバッグ用)

    Sora から type: redirect メッセージを受信した場合、 contactUrl と connectedUrl には異なる値がセットされます type: redirect メッセージを受信しなかった場合、 contactUrl と connectedUrl には同じ値がセットされます

    Declaration

    Swift

    public var contactUrl: URL? { get }
  • 接続中の URL

    Declaration

    Swift

    public var connectedUrl: URL? { get }
  • メディアチャンネルの内部で利用している RTCPeerConnection

    Declaration

    Swift

    public var native: RTCPeerConnection? { get }
  • クライアント ID 。接続後にセットされます。

    Declaration

    Swift

    public var clientId: String? { get }
  • バンドル ID 。接続後にセットされます。

    Declaration

    Swift

    public var bundleId: String? { get }
  • 接続 ID 。接続後にセットされます。

    Declaration

    Swift

    public var connectionId: String? { get }
  • 接続状態

    Declaration

    Swift

    public private(set) var state: ConnectionState { get set }
  • 接続中 (state == .connected) であれば true

    Declaration

    Swift

    public var isAvailable: Bool { get }
  • 接続開始時刻。 接続中にのみ取得可能です。

    Declaration

    Swift

    public private(set) var connectionStartTime: Date? { get }
  • 接続時間 (秒) 。 接続中にのみ取得可能です。

    Declaration

    Swift

    public var connectionTime: Int? { get }

接続中のチャネルの情報

  • 同チャネルに接続中のクライアントの数。 サーバーから通知を受信可能であり、かつ接続中にのみ取得可能です。

    Declaration

    Swift

    public private(set) var connectionCount: Int? { get }
  • 同チャネルに接続中のクライアントのうち、パブリッシャーの数。 サーバーから通知を受信可能であり、接続中にのみ取得可能です。

    Declaration

    Swift

    public private(set) var publisherCount: Int? { get }
  • 同チャネルに接続中のクライアントの数のうち、サブスクライバーの数。 サーバーから通知を受信可能であり、接続中にのみ取得可能です。

    Declaration

    Swift

    public private(set) var subscriberCount: Int? { get }

接続チャネル

  • ストリームのリスト

    Declaration

    Swift

    public var streams: [MediaStream] { get }
  • 最初のストリーム。 マルチストリームでは、必ずしも最初のストリームが 送信ストリームとは限りません。 送信ストリームが必要であれば senderStream を使用してください。

    Declaration

    Swift

    public var mainStream: MediaStream? { get }
  • 送信に使われるストリーム。 ストリーム ID が configuration.publisherStreamId に等しいストリームを返します。

    Declaration

    Swift

    public var senderStream: MediaStream? { get }
  • 受信ストリームのリスト。 ストリーム ID が configuration.publisherStreamId と異なるストリームを返します。

    Declaration

    Swift

    public var receiverStreams: [MediaStream] { get }

RPC

  • RPC メソッドを型安全に呼び出します

    このメソッドを使用して、Sora サーバーで定義された RPC メソッドを非同期で実行できます。

    Throws

    以下のエラーが発生することがあります

    • SoraError.rpcUnavailable: RPC チャネルが利用不可
    • SoraError.rpcEncodingError: パラメータのエンコーディングに失敗した
    • SoraError.rpcDecodingError: レスポンスのデコーディングに失敗した
    • SoraError.rpcDataChannelClosed: RPC の送受信に利用する DataChannel が切断された
    • SoraError.rpcTimeout: レスポンスがタイムアウト時間内に返されなかった
    • SoraError.rpcServerError: Sora からエラーレスポンスがあった

    使用例

    do {
      let response = try await mediaChannel.rpc(
        method: RequestSimulcastRid.self,
        params: RequestSimulcastRidParams(rid: "r0")
      )
    
      if let result = response?.result {
        print("Channel ID: \(result.channelId)")
      }
    } catch {
      print("RPC call failed: \(error)")
    }
    

    Declaration

    Swift

    public func rpc<M: RPCMethodProtocol>(
      method: M.Type,
      params: M.Params,
      isNotificationRequest: Bool = false,
      timeout: TimeInterval = 5.0
    ) async throws -> RPCResponse<M.Result>?

    Parameters

    method

    呼び出す RPC メソッドの型 (例: RequestSimulcastRid.self)

    params

    メソッドに渡すパラメータ。型安全に検証されます

    isNotificationRequest

    true の場合、送信後に Sora からのレスポンスを待ちません。デフォルトは false

    timeout

    レスポンスを待つ最大時間(秒)。デフォルトは 5.0 秒

    Return Value

    メソッドの実行結果。isNotificationRequest が true の場合は nil を返します

接続

  • 接続を解除します。

    Declaration

    Swift

    public func disconnect(error: Error?)

    Parameters

    error

    接続解除の原因となったエラー

  • libwebrtc の統計情報を取得します。 非同期取得中に切断された場合でも安全になるよう、コールバック内で self の生存確認、state == .connected の再確認、peerChannel.nativeChannel が同一インスタンスかどうか、をチェックしています。

    Declaration

    Swift

    public func getStats(handler: @escaping (Result<Statistics, Error>) -> Void)

    Parameters

    handler

    統計情報取得後に呼ばれるクロージャー

  • DataChannel を利用してメッセージを送信します

    Declaration

    Swift

    public func sendMessage(label: String, data: Data) -> Error?
  • MediaChannel の接続中にマイクをハードミュート有効化/無効化します

    Declaration

    Swift

    public func setAudioHardMute(_ mute: Bool) -> Error?

    Parameters

    mute

    true で有効化、false で無効化

    Return Value

    成功した場合は nil、失敗した場合は SoraError.mediaChannelError を返します

  • MediaChannel の接続中にマイクをソフトミュート有効化 / 無効化します

    Declaration

    Swift

    public func setAudioSoftMute(_ mute: Bool) -> Error?

    Parameters

    mute

    true で有効化、false で無効化

    Return Value

    成功した場合は nil、失敗した場合は SoraError.mediaChannelError を返します

  • MediaChannel の接続中に映像をソフトミュート有効化 / 無効化します 黒塗りフレームが送信される状態になります

    Declaration

    Swift

    public func setVideoSoftMute(_ mute: Bool) -> Error?

    Parameters

    mute

    true で有効化、false で無効化

    Return Value

    成功した場合は nil、失敗した場合は SoraError.mediaChannelError を返します

  • setVideoHardMute(_:) Asynchronous

    MediaChannel の接続中に映像をハードミュート有効化 / 無効化します

    端末カメラ利用が有効になっている必要があります 外部入力や別キャプチャ経路には対応していません

    内部で Actor により、操作を排他実行します。 同時に呼び出された場合は Actor 側で SoraError.mediaChannelError がスローされます

    映像ハードミュートは、黒塗りフレーム状態で停止させるためローカルトラックの停止を含みます 事前に映像ソフトミュートを利用していた場合は状態が上書きされます ハードミュート解除時に直前のソフトミュートの状態を復元するようなことはしません

    Throws

    エラー時は SoraError.cameraError または SoraError.mediaChannelError がスローされます

    Declaration

    Swift

    public func setVideoHardMute(_ mute: Bool) async throws

    Parameters

    mute

    true で有効化、false で無効化