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 を識別する IDdeviceStorage:AVCaptureDeviceを保持する lock 付き storagenativeStorage: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が 排他します。 どちらも任意のスレッドから読み書きできます。
See moreSendableに準拠するのは、共有状態を owner が、non-Sendable な実資源を lock 付き storage が保持しているためです。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 (
See moreSora.subscribeEvents(bufferingPolicy:)/MediaChannel.subscribeEvents(bufferingPolicy:)) の対象外であり、従来どおりこの handler で 受け取る。Declaration
Swift
public class CameraVideoCapturerHandlers -
ICE Candidate を表します。
See moreDeclaration
Swift
public final class ICECandidate : Equatable -
ICE サーバーの情報を表します。
See moreDeclaration
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 から購読する場合は
See moreMediaChannel.subscribeEvents(bufferingPolicy:)を使う。新しい購読 API は、この handler と 同じ配送点から対応するイベントを配送する。Declaration
Swift
public final class MediaChannelHandlers -
一度接続を行ったメディアチャネルは再利用できません。 同じ設定で接続を行いたい場合は、新しい接続を行う必要があります。
接続が解除されるタイミング
メディアチャネルの接続が解除される条件を以下に示します。 いずれかの条件が 1 つでも成立すると、メディアチャネルを含めたすべてのチャネル (シグナリングチャネル、ピアチャネル、 WebSocket チャネル) の接続が解除されます。
- シグナリングチャネル (
SignalingChannel) の接続が解除される。 - WebSocket チャネル (
WebSocketChannel) の接続が解除される。 - ピアチャネル (
PeerChannel) の接続が解除される。 - サーバーから受信したシグナリング
pingに対してpongを返さない。 これはピアチャネルの役目です。
Declaration
Swift
public final class MediaChannelextension 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 から購読する場合は
See moreMediaChannel.subscribeEvents(bufferingPolicy:)を使う。新しい購読 API は、この handler と 同じ配送点から対応するイベントを配送する。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 から購読する場合は
See moreSora.subscribeEvents(bufferingPolicy:)を使う (接続ごとのイベントはMediaChannel.subscribeEvents(bufferingPolicy:))。新しい購読 API は、 この handler と同じ配送点から対応するイベントを配送する。Declaration
Swift
public final class SoraHandlers -
サーバーへのインターフェースです。
See moreSoraオブジェクトを使用してサーバーへの接続を行います。Declaration
Swift
public final class Sora : @unchecked Sendable -
サーバーへの接続試行中の状態を表します。
See morecancel()で接続をキャンセル可能です。Declaration
Swift
public final class ConnectionTask -
WebRTC の統計情報を SDK から扱いやすい形にしたコンテナーです。
See moreDeclaration
Swift
public class Statistics -
単一の WebRTC 統計エントリーを表します。
See moreDeclaration
Swift
public class StatisticsEntry -
VideoRenderer プロトコルのデフォルト実装となる UIView です。
MediaStream.videoRenderer にセットすることで、その MediaStream に流れている映像をそのまま画面に表示することができます。
contentModeの設定
VideoView は contentMode の設定に対応しており、 contentMode プロパティに任意の値を設定することで映像のレンダリングのされ方を変更することができます。
- コード上からプログラム的に VideoView を生成した場合、デフォルト値は
scaleAspectFitになります。 - Storyboard や Interface Builder 経由で VideoView を生成した場合、 Storyboard や Interface Builder 上で設定した Content Mode の値が使用されます。
Declaration
Swift
@MainActor public class VideoView : UIView - コード上からプログラム的に VideoView を生成した場合、デフォルト値は
-
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 文字列が
See moreMediaChannelのsignalingReceivedJSONとして配送される。生のWebSocketMessage(binary を含む) を受け取る 経路はこの handler だけであり、新しい購読 API の対象外である。Declaration
Swift
public final class WebSocketChannelHandlers
View on GitHub
Install in Dash
Classes Reference