音声の操作

音声トラック毎に音量やミュートを設定する

1 つのコネクションに対して

音声をミュートする

音声をミュートするには メディアストリーム (MediaStream) の audioEnabled プロパティに false をセットします。 ただし送信音声についてミュートした場合、マイクは停止しませんので注意してください。

// 指定の ConnectionID を持つ受信 Stream の音声のミュート状態を切り替える
private func handleMuteReceiveStream(connectionId: String) {
    // 受信したストリームのリストを取得する
    // Sora 接続成功時に取得する MediaChannel を mediaChannel に保持しているものとする
    let downstreams = mediaChannel?.receiverStreams ?? []
    // downstreams が空の場合は何もしない
    guard downstreams.count > 0 else {
        return
    }
    for stream in downstreams {
        // 指定のコネクションIDを持つ Stream の audioEnabled を切り替える
        if stream.streamId == connectionId {
            stream.audioEnabled = !stream.audioEnabled
        }
    }
}

受信した音声の音量を変更する

ロールRole.recvonly または Role.sendrecv のとき、 メディアストリーム (MediaStream) の remoteAudioVolume プロパティで受信ストリームの音量が変更できます。 このプロパティは 0 から 10 の値をとります。 0 をセットすると音声は出力されません。

送信ストリームで送信する音声の音量は変更できません。

let config = Configuration(url: url,
                            channelId: channelId,
                            role: .sendrecv,
                            multistreamEnabled: true)

// 送信または受信のストリームが追加されたときのイベントハンドラ
config.mediaChannelHandlers.onAddStream = { [weak self] stream in
    // クロージャーの実行時、 self が存在する場合のみ処理を続けます。
    guard let self = self else {
        return
    }
    // 受信ストリームのときのみ音量変更を行う
    if stream.streamId != config.publisherStreamId {
        stream.remoteAudioVolume = 3.0
    }
}

任意の音声を送信する

WebRTC ライブラリの制約により、 Sora iOS SDK ではマイク入力以外の音声を送信できません。ご了承ください。

AVAudioSession のプロパティを変更する

重要

iOS 14.0 で、音声モードをデフォルト以外からデフォルトに戻したときに音声が出力されない事象を確認しています。その場合は端末を iOS 14.1 以降にアップデートしてください。

Sora iOS SDK では、AVAudioSession のプロパティを変更する簡易的な API として、 Sora.setAudioMode メソッド を用意しています。

この API は AVAudioSession の次のプロパティを変更します

  • 音声モード (AVAudioSession.Mode)

  • 音声カテゴリ (AVAudioSession.Category)

  • 音声カテゴリオプション (AVAudioSession.CategoryOptions)

  • 音声経路 (AVAudioSession.PortOverride)

ピア接続の設定や端末の状況によっては設定が反映されない場合があるので注意してください。

Sora.setAudioMode メソッド の型と引数は以下の通りです。

  • mode: AudioMode

    • AudioMode は Sora iOS SDK で利用可能な 3 種類の音声モードです。

      • default

        • default の音声モードを利用します。音声カテゴリ、音声出力先の指定ができます。

      • videoChat

        • videoChat の音声モードを利用します。音声カテゴリは playAndRecord、音声出力先はスピーカーを使用します

      • voiceChat

        • voiceChat の音声モードを利用します。音声カテゴリは playAndRecord、音声出力先の指定ができます。

  • options: AVAudioSession.CategoryOptions

    • 指定は任意です。デフォルトで allowBluetoothallowBluetoothA2DPallowAirPlay が設定されています。

    • 指定した場合はデフォルトの音声カテゴリオプションは設定されず、指定した音声カテゴリオプションのみが設定されます。

AudioMode の指定方法および AVAudioSession のプロパティ設定内容

AudioMode はモード毎にそれぞれ異なる引数を取ります。 指定する引数の内容と、指定された引数によって設定される AVAudioSession のプロパティの値は以下のとおりです。

  • default(category: AVAudioSession.Category, output: AudioOutput)

    • 音声モードに default を設定します

    • 音声カテゴリに引数で指定された category を設定します

    • output には AudioOutputdefault または speaker を指定します

      • output に speaker が指定されていた時、音声カテゴリオプションに defaultToSpeaker が追加で設定されます

  • videoChat

    • 音声モードに videoChat が設定されます

    • 音声カテゴリに playAndRecord が設定されます

  • voiceChat(output: AudioOutput)

    • 音声モードに voiceChat を設定します

    • 音声カテゴリに playAndRecord を設定します

    • output には AudioOutputdefault または speaker を指定します

      • output に speaker が指定されていた時、音声カテゴリオプションに defaultToSpeaker が追加で設定されます

      • output に speaker が指定されていた時、音声経路に speaker が設定されます

設定例

以下に Sora.setAudioMode メソッド を利用した AVAudioSession のプロパティ変更の例を示します。

import Sora
// 接続時のコールバック onConnect で音声モードを変更する
config.mediaChannelHandlers.onConnect = { [weak self] _ in

    // default の音声モードを選択し、音声カテゴリに playAndRecord、音声出力先に speaker を指定する
    // 任意のカテゴリオプションには duckOthers を指定する
    let result = Sora.shared.setAudioMode(.default(category: .playAndRecord, output: .speaker), options: .duckOthers)

    // 必要に応じてエラーハンドリングを行う
    switch result {
    case .success():
       // 成功
    case .failure(let error):
       // 失敗
    }
}

さらに細かい設定を行う場合は AVAudioSession の継承クラスである libwebrtc の RTCAudioSession を使用して設定が可能です。 設定を行った結果、libwebrtc の動作に影響が出て、正常に動作しなくなる可能性があるため、libwebrtc の挙動を理解した上で設定をしてください。

音声モードを変更するタイミング

音声モードの変更は 接続完了後 に行ってください。 Sora iOS SDK は接続完了時に接続設定に従って音声カテゴリを変更するので、接続完了前にセットした音声モードは接続完了時に上書きされます。

その他の操作

音声の出力は AVAudioSession により管理されているため、その他の操作は AVAudioSession を利用してください。

マイクのパーミッションについて

マイクのパーミッションは配信時にのみ要求されます。 マイクを使う場合は、 必ず Info.plist にマイクの用途を記述してください。

© Copyright 2018-2024, Shiguredo Inc. Created using Sphinx 8.0.2