音声の操作¶
音声トラック毎に音量やミュートを設定する¶
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
指定は任意です。デフォルトで
allowBluetooth
、allowBluetoothA2DP
、allowAirPlay
が設定されています。指定した場合はデフォルトの音声カテゴリオプションは設定されず、指定した音声カテゴリオプションのみが設定されます。
AudioMode の指定方法および AVAudioSession のプロパティ設定内容¶
AudioMode はモード毎にそれぞれ異なる引数を取ります。 指定する引数の内容と、指定された引数によって設定される AVAudioSession のプロパティの値は以下のとおりです。
default(category: AVAudioSession.Category, output: AudioOutput)
音声モードに
default
を設定します音声カテゴリに引数で指定された category を設定します
output には AudioOutput の
default
またはspeaker
を指定しますoutput に
speaker
が指定されていた時、音声カテゴリオプションにdefaultToSpeaker
が追加で設定されます
videoChat
音声モードに
videoChat
が設定されます音声カテゴリに
playAndRecord
が設定されます
voiceChat(output: AudioOutput)
音声モードに
voiceChat
を設定します音声カテゴリに
playAndRecord
を設定しますoutput には AudioOutput の
default
またはspeaker
を指定しますoutput に
speaker
が指定されていた時、音声カテゴリオプションにdefaultToSpeaker
が追加で設定されますoutput に
speaker
が指定されていた時、音声経路にspeaker
が設定されます
設定例¶
以下に Sora.setAudioMode メソッド を利用した AVAudioSession のプロパティ変更の例を示します。
import Sora
// 接続時のコールバック onConnect で音声モードを変更する
config.mediaChannelHandlers.onConnect = { [weak self] _ in
// setAudioMode を利用して、AVAudioSession のプロパティを変更する
// AudioSeesion は以下のように設定される
// - Category : playAndRecord
// - Mode : default
// - CategoryOptions : defaultToSpeaker, allowBluetooth, allowBluetoothA2DP, allowAirPlay
// - output に speaker を設定することで defaultToSpeaker が設定される
// - options は未指定のときと同様の設定。ここでは設定方法の例として記載している。
let result = Sora.shared.setAudioMode(.default(category: .playAndRecord, output: .speaker), options: [.allowBluetooth, .allowBluetoothA2DP, .allowAirPlay])
// 必要に応じてエラーハンドリングを行う
switch result {
case .success():
// 成功
case .failure(let error):
// 失敗
}
}
さらに細かい設定を行う場合は AVAudioSession
の継承クラスである libwebrtc の RTCAudioSession
を使用して設定が可能です。
設定を行った結果、libwebrtc の動作に影響が出て、正常に動作しなくなる可能性があるため、libwebrtc の挙動を理解した上で設定をしてください。
音声モードを変更するタイミング¶
音声モードの変更は 接続完了後 に行ってください。 Sora iOS SDK は接続完了時に接続設定に従って音声カテゴリを変更するので、接続完了前にセットした音声モードは接続完了時に上書きされます。
その他の操作¶
音声の出力は AVAudioSession
により管理されているため、その他の操作は AVAudioSession
を利用してください。
マイクのパーミッションについて¶
マイクのパーミッションは配信時にのみ要求されます。 マイクを使う場合は、 必ず Info.plist にマイクの用途を記述してください。