音声再生ガイド

概要

Sora Flutter SDK における受信音声の再生、音声トラックの検知、再生まわりでできること / できないことについて説明します。

最初に押さえるポイント

  • リモート音声は、 audio: true で接続した際に SDK とプラットフォーム側の標準経路で再生されます
  • recvonly による音声受信のみであれば、マイク利用の権限や設定は不要です
  • スピーカー選択、再生音量変更、再生先デバイス切り替えを行う専用 API は公開されていません

音声を受信して再生する

音声を受信したい場合は、接続設定で audio: true を指定します。

final config = SoraConnectionConfig(
  signalingUrls: <String>['wss://example.com/signaling'],
  channelId: 'example-channel',
  role: SoraRole.recvonly,
  audio: true,
  video: false,
);
final conn = await Sora.createConnection(config);
await conn.connect();

この構成では、Sora から受信した音声を再生します。アプリ側で音声再生用の Widget やプレーヤーを別途作る必要はありません。

audio: true と音声再生の関係

audio: true は、Sora 接続で音声を扱う設定です。

  • recvonlyaudio: true: 受信音声を再生する構成
  • sendonlyaudio: true: 音声送信を行う構成
  • sendrecvaudio: true: 音声送受信を行う構成
  • audio: false かつ video: false: 音声を使わない構成

そのため、音声再生を使いたい場合は audio: true が必要ですが、マイク利用等の音声入力とは切り分けて考える必要があります。

音声トラックを検知する

リモート音声トラックの追加 / 削除は conn.eventsRemoteMediaStreamTrackkind == 'audio' を判定して確認できます。

conn.events.listen((event) {
  switch (event) {
    case SoraTrackEvent(:final track):
      if (track.kind == 'audio') {
        print('audio track added: ${track.trackId} ${track.connectionId}');
      }
    case SoraRemoveTrackEvent(:final track):
      if (track.kind == 'audio') {
        print('audio track removed: ${track.trackId}');
      }
    default:
      break;
  }
});

trackId は、複数のリモートトラックを扱うときの識別に使えます。

接続状態とあわせて見る

音声が再生される前提を確認したいときは、 conn.events の接続状態とトラックイベントをあわせて見ると状況を追いやすくなります。

conn.events.listen((event) {
  switch (event) {
    case SoraConnectionStateChangedEvent(:final state):
      print('state=$state');
    case SoraTrackEvent(:final track):
      if (track.kind == 'audio') {
        print('audio track: ${track.trackId}');
      }
    default:
      break;
  }
});

接続済みでも音声トラックが来ていなければ、再生対象の音声はありません。

できないこと

Sora Flutter SDK の公開 API では、次のような再生制御はできません。

  • 再生先スピーカーの選択
  • イヤホン / スピーカーの切り替え制御
  • リモート音声ごとの再生音量変更
  • 受信音声だけを個別にミュートする専用 API

受信音声は SDK とプラットフォームの標準経路で再生されます。ストリームだけを別プレーヤー API に差し替えることは想定していません。出力のルーティングは OS と libwebrtc の挙動に従います。

プラットフォームごとの注意

Android

  • 音声出力のルーティングは Android / libwebrtc の標準挙動に従います
  • Bluetooth / earpiece / speaker の切り替えは communication route の制約を受けるため、出力先を常に厳密指定できるとは限りません

iOS / iPadOS

  • 音声の再生先は AVAudioSession の route に従います
  • AirPlay や Bluetooth などの再生先をユーザーに選ばせる場合は、アプリ側で AVRoutePickerView を利用してください

macOS

  • 音声は OS / CoreAudio の既定音声出力へ再生されます
  • SDK から再生先を明示選択する public API はありません

あわせて読むとよいページ