Classes

The following classes are available globally.

  • カメラをキャプチャするクラスです。

    解像度やフレームレートなどの設定は start 実行時に指定します。 カメラはパブリッシャーまたはグループの接続時に自動的に起動 (起動済みなら再起動) されます。

    カメラの設定を変更したい場合は、 change を実行します。

    共有状態は CameraStateOwner が、device は instance ごとの lock 付き storage が、 handlers は型全体で共有する lock 付き storage (private static let handlersStorage) が 保持します。この型が持つ instance の stored property は次の 3 つだけです。

    • id: instance を識別する ID
    • deviceStorage: AVCaptureDevice を保持する lock 付き storage
    • nativeStorage: RTCCameraVideoCapturer とその delegate を保持する storage

    不変条件は次のとおりです。RTCCameraVideoCapturer の start / stop と AVCaptureDevice の使用は libwebrtc の capture session queue 上でのみ行います。 camera queue への hop は CameraQueueExecutor に閉じ込めており、start / stop / restart / change / flip はすべてこの queue を経由します。 frame callback (CameraVideoCapturerDelegate.capturer(_:didCapture:)) も libwebrtc の capture session queue 上で発火する前提とします (upstream の実装を 確認できないため、現行の挙動を前提とします)。

    一方で current / isRunning / format / frameRate は owner の snapshot と resource テーブルから、stream は owner の resource テーブルから (弱参照のため capturer は MediaStream を保持しません)、device / position は instance の lock 付き storage から、handlers は型全体で共有する lock 付き storage から、captureSession は init で確定して以後差し替えない storage から読むため、任意のスレッドから呼べます。 device の setter も任意のスレッドから呼べるため、command の実行中に device を差し替えると、 その command が読む device は差し替え前後で変わり得ます。 handlers の get / set が排他するのは参照だけであり、返した CameraVideoCapturerHandlers が 持つイベントハンドラのプロパティは、その instance がプロパティごとに持つ HandlerStorage が 排他します。 どちらも任意のスレッドから読み書きできます。

    Sendable に準拠するのは、共有状態を owner が、non-Sendable な実資源を lock 付き storage が保持しているためです。

    See more

    Declaration

    Swift

    public final class CameraVideoCapturer : Sendable
  • CameraVideoCapturer のイベントハンドラです。

    イベントハンドラのプロパティの get / set は、プロパティごとの HandlerStorage が持つ NSLock で 排他します。 利用する任意の executor からの設定と、配送する executor (onCapture は camera の capture session queue の frame callback、onStart / onStop は start / stop / restart / change / flip の 完了通知) からの読み取りが並行してもデータ競合しません。配送側は lock を解放してから取得済みの closure を呼びます (HandlerStorage の doc 参照)。

    CameraVideoCapturer.handlers は型全体で共有する storage が、差し替えない限り同じ instance を 返すため、CameraVideoCapturer.handlers.onCapture = ... のような in-place 変更もその instance の HandlerStorage が排他します (CameraHandlersStorage が排他するのは参照の get / set だけです)。

    呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

    配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティごとの storage が排他するのは読み書きだけであり、配送側は lock を解放してから 取得済みの closure を呼ぶ)。

    Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。CameraVideoCapturer は Sendable のためそのまま main actor へ渡せる。VideoFrame は Sendable ではなく、onCapture は返した frame の所有権を SDK へ移すため、frame を Task へ運ばずに返却前に処理を終えること (nonisolated(unsafe) let で frame を main actor へ運ぶと、返却の後に frame を参照・変更する 経路が生まれる)。

    カメラのイベントは新しい購読 API (Sora.subscribeEvents(bufferingPolicy:) / MediaChannel.subscribeEvents(bufferingPolicy:)) の対象外であり、従来どおりこの handler で 受け取る。

    See more

    Declaration

    Swift

    public class CameraVideoCapturerHandlers
  • ICE Candidate を表します。

    See more

    Declaration

    Swift

    public final class ICECandidate : Equatable
  • ICE サーバーの情報を表します。

    See more

    Declaration

    Swift

    public final class ICEServerInfo
  • メディアチャネルのイベントハンドラです。

    イベントハンドラのプロパティの get / set は、プロパティごとの HandlerStorage が持つ NSLock で 排他します。 利用する任意の executor からの設定と、配送する executor からの読み取りが並行しても データ競合しません。配送側は lock を解放してから取得済みの closure を呼ぶため、closure の 中から別の handler を設定しても deadlock しません。設定と配送が競合した場合にどちらの closure が 呼ばれるかは、lock の取得順で決まります (設定が次の配送から反映されるという契約は変わりません)。

    呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

    配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティごとの storage が排他するのは読み書きだけであり、配送側は lock を解放してから 取得済みの closure を呼ぶ)。

    Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。MediaChannel / MediaStream / Signaling は Sendable ではないため、main actor へ渡す場合は nonisolated(unsafe) let で運び、Task { @MainActor in ... } で main actor 上へ移す。

    イベントを actor / Task から購読する場合は MediaChannel.subscribeEvents(bufferingPolicy:) を使う。新しい購読 API は、この handler と 同じ配送点から対応するイベントを配送する。

    See more

    Declaration

    Swift

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

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

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

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

    Declaration

    Swift

    public final class MediaChannel
    extension MediaChannel: CustomStringConvertible
  • ストリームのイベントハンドラです。

    イベントハンドラのプロパティの get / set は、プロパティごとの HandlerStorage が持つ NSLock で 排他します。 利用する任意の executor からの設定と、videoEnabled / audioEnabled の確定を配送する executor からの読み取りが並行してもデータ競合しません。配送側は lock を解放してから取得済みの closure を呼びます (HandlerStorage の doc 参照)。

    呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

    配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティごとの storage が排他するのは読み書きだけであり、配送側は lock を解放してから 取得済みの closure を呼ぶ)。

    Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。payload は Bool の ため、main actor へそのまま渡せる。

    イベントを actor / Task から購読する場合は MediaChannel.subscribeEvents(bufferingPolicy:) を使う。新しい購読 API は、この handler と 同じ配送点から対応するイベントを配送する。

    See more

    Declaration

    Swift

    public final class MediaStreamHandlers
  • Sora オブジェクトのイベントハンドラです。

    呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

    配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティの読み書きを排他する lock は無く、並行する設定変更はデータ競合になる)。

    Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。MediaChannel と RTCAudioSession は Sendable ではないため、main actor へ渡す場合は nonisolated(unsafe) let で運び、Task { @MainActor in ... } で main actor 上へ移す (AVAudioSession.RouteChangeReason と AVAudioSessionRouteDescription は Sendable のため そのまま渡せる)。

    イベントを actor / Task から購読する場合は Sora.subscribeEvents(bufferingPolicy:) を使う (接続ごとのイベントは MediaChannel.subscribeEvents(bufferingPolicy:))。新しい購読 API は、 この handler と同じ配送点から対応するイベントを配送する。

    See more

    Declaration

    Swift

    public final class SoraHandlers
  • サーバーへのインターフェースです。 Sora オブジェクトを使用してサーバーへの接続を行います。

    See more

    Declaration

    Swift

    public final class Sora : @unchecked Sendable
  • サーバーへの接続試行中の状態を表します。 cancel() で接続をキャンセル可能です。

    See more

    Declaration

    Swift

    public final class ConnectionTask
  • WebRTC の統計情報を SDK から扱いやすい形にしたコンテナーです。

    See more

    Declaration

    Swift

    public class Statistics
  • 単一の WebRTC 統計エントリーを表します。

    See more

    Declaration

    Swift

    public class StatisticsEntry
  • VideoRenderer プロトコルのデフォルト実装となる UIView です。

    MediaStream.videoRenderer にセットすることで、その MediaStream に流れている映像をそのまま画面に表示することができます。

    contentModeの設定

    VideoView は contentMode の設定に対応しており、 contentMode プロパティに任意の値を設定することで映像のレンダリングのされ方を変更することができます。

    • コード上からプログラム的に VideoView を生成した場合、デフォルト値は scaleAspectFit になります。
    • Storyboard や Interface Builder 経由で VideoView を生成した場合、 Storyboard や Interface Builder 上で設定した Content Mode の値が使用されます。
    See more

    Declaration

    Swift

    @MainActor
    public class VideoView : UIView
  • WebSocket チャネルのイベントハンドラです。

    イベントハンドラのプロパティの get / set は、プロパティごとの HandlerStorage が持つ NSLock で 排他します。 利用する任意の executor からの設定と、URLSession の delegate callback からの読み取りが並行しても データ競合しません。配送側は lock を解放してから取得済みの closure を呼びます (HandlerStorage の doc 参照)。

    呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

    配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティごとの storage が排他するのは読み書きだけであり、配送側は lock を解放してから 取得済みの closure を呼ぶ)。

    Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。payload は WebSocketMessage (Sendable) のため、main actor へそのまま渡せる。

    新しい購読 API では、受信したシグナリングの JSON 文字列が MediaChannel の signalingReceivedJSON として配送される。生の WebSocketMessage (binary を含む) を受け取る 経路はこの handler だけであり、新しい購読 API の対象外である。

    See more

    Declaration

    Swift

    public final class WebSocketChannelHandlers