MediaStream

public protocol MediaStream : AnyObject

メディアストリームの機能を定義したプロトコルです。 デフォルトの実装は非公開 (internal) であり、カスタマイズはイベントハンドラでのみ可能です。 ソースコードは公開していますので、実装の詳細はそちらを参照してください。

メディアストリームは映像と音声の送受信を行います。 メディアストリーム 1 つにつき、 1 つの映像と 1 つの音声を送受信可能です。

イベントハンドラ

接続情報

映像と音声の可否

  • 映像の可否。 false をセットすると、サーバーへの映像の送受信を停止します。 true をセットすると送受信を再開します。

    setter は映像レンダラーの onSwitch(video:) の配送完了を待ちません。getter は SDK が 保持する確定値を即時に返し、native track の isEnabled への反映は確定時に行います。

    複数の公開 API から並行に変更した場合は operation の世代で確定が調停され、後から開始した operation が先に値を確定すると自分の書き込みが破棄され得ます (呼び出しは成功を返します)。

    Declaration

    Swift

    var videoEnabled: Bool { get set }
  • 音声の可否。 false をセットすると、サーバーへの音声の送受信を停止します。 true をセットすると送受信を再開します。

    サーバーへの送受信を停止しても、マイクはミュートされませんので注意してください。

    setter は映像レンダラーの onSwitch(audio:) の配送完了を待ちません。getter は SDK が 保持する確定値を即時に返し、native track の isEnabled への反映は確定時に行います。

    複数の公開 API から並行に変更した場合は operation の世代で確定が調停され、後から開始した operation が先に値を確定すると自分の書き込みが破棄され得ます (呼び出しは成功を返します)。

    Declaration

    Swift

    var audioEnabled: Bool { get set }
  • 映像トラックを保持している場合は true を返します。

    映像ミュート時に映像トラックが存在するかチェックするために使用されます。 ミュート時の確定処理は返り値やエラーを返さないため、 呼び出し側へエラーを通知するために必要となります。

    Declaration

    Swift

    var hasVideoTrack: Bool { get }
  • 音声トラックを保持している場合は true を返します。

    音声ミュート時に音声トラックが存在するかチェックするために使用されます。 ミュート時の確定処理は返り値やエラーを返さないため、 呼び出し側へエラーを通知するために必要となります。

    Declaration

    Swift

    var hasAudioTrack: Bool { get }
  • 受信した音声のボリューム。 0 から 10 (含む) までの値をセットします。 このプロパティはロールがサブスクライバーの場合のみ有効です。

    Declaration

    Swift

    var remoteAudioVolume: Double? { get set }

音声データ取得

  • RTCAudioTrackSink を RTCAudioTrack に関連付けます。 追加済みのシンクを再度追加した場合は何もしません。

    Declaration

    Swift

    func addAudioTrackSink(_ sink: RTCAudioTrackSink)
  • RTCAudioTrackSink の関連付けを解除します。 未追加の RTCAudioTrackSink を指定した場合は何もしません。

    Declaration

    Swift

    func removeAudioTrackSink(_ sink: RTCAudioTrackSink)

映像フレームの送信

  • 映像フィルター

    filter(videoFrame:) はストリームごとの直列 executor 上で呼ばれます。同じストリームで 同時に 2 つの frame が filter へ入ることはありません。同じ instance を複数のストリームへ 設定した場合はストリームごとに直列化されるため、排他は利用者の責任です。

    getter と setter は内部の lock で直列化されるため、別々のスレッドから同時に呼んでも 設定は一意に定まります。交換は既に受理された frame の実行順とは同期しません (各 frame が 使う filter は実行直前に読んだ値で一意に決まります)。

    Declaration

    Swift

    var videoFilter: VideoFilter? { get set }
  • 映像レンダラー。

    renderer callback の配送 executor は main queue です。setter は callback の配送完了を 待ちません。設定した instance を再度設定した場合と nil を nil へ代入した場合は 何も配送しません。別の instance へ交換した場合は、以前の renderer に onRemoved が 1 回配送されます。

    getter と setter は内部の lock で直列化されるため、別々のスレッドから同時に呼んでも 設定は一意に定まります。どのスレッドから呼んでもかまいません。

    terminate() の後に新しい renderer を設定しても何も配送しません (終了したストリームでは onAdded の後に onDisconnect が届かない renderer が生まれるためです)。nil の代入に よる取り外しは terminate() の後でも行えます。

    Declaration

    Swift

    var videoRenderer: VideoRenderer? { get set }
  • 映像フレームをサーバーに送信します。 送信される映像フレームは映像フィルターを通して加工されます。 映像レンダラーがセットされていれば、加工後の映像フレームが 映像レンダラーによって描画されます。

    フィルターの実行と RTCVideoSource への配送、映像レンダラーへの callback は 非同期に行われます。このメソッドは配送の完了を待たずに戻ります。呼び出し側は frame の 所有権を SDK へ移し、このメソッドが戻った後に videoFrame とそれが保持する画素データを 参照・変更しないでください。

    映像トラックを持たないストリーム (video source が nil) では frame は配送されず、 VideoFilter も呼ばれません。フィルターの実行が滞留している場合、上限を超えて到着した frame は破棄されます。 terminate() の後に到着した frame も配送されません。

    Declaration

    Swift

    func send(videoFrame: VideoFrame?)

    Parameters

    videoFrame

    送信する映像フレーム。 nil を指定した場合は何もしません。

終了処理

  • ストリームの終了処理を行います。

    以降に到着した frame と renderer の frame / size / switch は配送されません。VideoRenderer の onDisconnect は終了処理を呼んだ時点の renderer へ 1 回だけ (main queue へ非同期に) 配送し、onRemoved は配送しません。MediaStreamHandlers.onSwitchVideo / onSwitchAudio は 終了処理の後も呼ばれ得ますが、renderer の onSwitch は配送されません。

    Declaration

    Swift

    func terminate()