macOS 向けガイド

概要

macOS アプリで sora_sdk を利用する方法について説明します。

権限

macOS で音声や映像を配信する場合はカメラとマイクの権限が必要になります。SDK は権限リクエストを行わないため、アプリ側で Info.plist の用途説明と Entitlements の設定を実装してください。

Info.plist の用途説明

<key>NSCameraUsageDescription</key>
<string>カメラを利用する目的を記述します</string>
<key>NSMicrophoneUsageDescription</key>
<string>マイクを利用する目的を記述します</string>

Entitlements の設定

App Sandbox を有効にしている場合はカメラとマイクの Entitlement を追加してください。 DebugProfile.entitlementsRelease.entitlements の両方に設定する必要があります。

<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>

また、 Sora への接続には com.apple.security.network.client が必要です。

<key>com.apple.security.network.client</key>
<true/>

映像レンダリング

macOS でも映像レンダリングは Flutter の Texture を使います。取得元はローカル映像とリモート映像の 2 種類があり、それぞれ別の経路で textureId を受け取ります。

ローカル映像のレンダリング

ローカル映像は、 MediaDevices.getUserMedia() で取得した LocalVideoTrack から textureId を取り出して Texture に渡すことでレンダリングできます。接続前のカメラプレビューもこの方法で行えます。

// カメラ・マイクから LocalMediaStream を取得する
final stream = await MediaDevices.getUserMedia(
  const GetUserMediaOptions(audio: true, video: true),
);

// 映像トラックから textureId を取得する
final videoTrack = stream.getVideoTracks().first;
final localTextureId = await videoTrack.textureId;
// 取得した textureId を Flutter の Texture に渡してレンダリングする
Texture(textureId: localTextureId)

接続は任意のタイミングで行います。

// Sora に接続して配信を開始する
await client.connect(stream);

リモート映像のレンダリング

接続相手から受信した映像は client.eventsSoraTrackEvent で通知されます。 track.kind'video' のとき、 track.textureIdTexture に渡してレンダリングします。

// 接続相手の映像トラック追加イベントを受け取る
client.events.listen((event) {
  // 映像トラックのときだけ textureId を保持する
  if (event case SoraTrackEvent(:final track) when track.kind == 'video') {
    setState(() {
      remoteTextureId = track.textureId;
    });
  }
});
// 受け取った textureId を Flutter の Texture に渡してレンダリングする
Texture(textureId: remoteTextureId!)

ビルド時の注意

  • 対応 OS は macOS 15 以降です
  • 現行の SDK 実装は Apple Silicon 前提です
  • 動作確認の開始時は flutter run -d macos を使うと切り分けしやすくなります
  • 配布ビルドでは flutter build macos --release を前提に確認してください
  • カメラやマイクを使う場合は、ビルド前に Info.plist の用途説明と Entitlements の設定を必ず行ってください
  • アプリ側で CocoaPods や Xcode 設定を独自に変更する場合は、SDK 側が前提にしているリンク設定を壊さないように注意してください