# リリースノート

**CHANGE**
: 後方互換性のない変更

**UPDATE**
: 後方互換性がある変更

**ADD**
: 後方互換性がある追加

**FIX**
: バグ修正

## 2026.1.0

**日時**: 2026-03-02
**対応 Sora**: 2025.2.0 以降
**対応 Android**: 5.0 以降
**対応 libwebrtc**: 144.7559.2.2

### ハイライト

- クライアントの WebRTC 統計情報を取得するための `getStats` メソッドを `SoraMediaChannel` に追加しました- 詳細は [統計情報](webrtc_stats.html) をご確認ください
- CameraVideoCapturer を Sora Android SDK 内で生成し自動制御する機能を追加しました- 詳細は [SDK 内部で CameraVideoCapturer を管理する](video.html#f0e57e) をご確認ください
- 音声のミュート切り替えを行う `setAudioHardMute` と `setAudioSoftMute` を `SoraMediaChannel` に追加しました- Sora Android SDK 2025.3.0 ではハードミュートには `setAudioRecordingPaused` 、ソフトミュートには `AudioTrack.setEnabled` を使う必要がありましたが、統一された API になりました
  - 使い方は [ミュート機能](mute.html) をご確認ください
- 映像のミュート切り替えを行う `setVideoHardMute` と `setVideoSoftMute` を `SoraMediaChannel` に追加しました- Sora Android SDK 2025.3.0 ではハードミュートには `org.webrtc.CameraVideoCapturer` の `startCapture()` と `stopCapture()` 、ソフトミュートには `VideoTrack.setEnabled` を使う必要がありましたが、統一された API になりました
  - 使い方は [ミュート機能](mute.html) をご確認ください
- RPC 機能を追加しました- `SoraMediaChannel.rpc` で JSON-RPC 2.0 over DataChannel による API 呼び出しができます
  - 詳細は [RPC 機能](rpc.html) をご確認ください

### 破壊的変更

- `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid? = null)` のデフォルト値を削除して `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid?)` に変更しました- `enableSimulcast(null)` としていた場合は、新旧どちらの enableSimulcast が利用されるかコンパイラが決定できないため以下の対応が必要です- 明示的に `enableSimulcast(requestRid = null)` のように名前付き引数を指定する
    - `enableSimulcast()` と引数を指定しないようにする- 移行先の `enableSimulcast(requestRid: SoraVideoOption.SimulcastRequestRid? = null)` が利用されますが、動作に変更はありません
  - 以下の場合はコンパイラによって自動的に解決されるので移行作業は不要です- `enableSimulcast(SoraVideoOption.SimulcastRid.R1)` のように引数ありの場合は従来の `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid?)` に解決されます
    - `enableSimulcast()` のように引数なしの場合は移行先の `enableSimulcast(requestRid: SoraVideoOption.SimulcastRequestRid? = null)` に解決されます

### 非推奨情報

- `SoraMediaChannel.setAudioRecordingPaused` を非推奨にしました- 移行先は `SoraMediaChannel.setAudioHardMute` です
- `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid?)` を非推奨にしました- 2027 年 12 月リリースの Sora にて、シグナリング接続時の `simulcast_rid` が廃止予定であるため非推奨にしました
  - 移行先は `SoraMediaOption.enableSimulcast(requestRid: SoraVideoOption.SimulcastRequestRid? = null)` です

### 変更履歴

- [CHANGE] `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid? = null)` のデフォルト値を削除して `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid?)` に変更しました- 同時に `SoraMediaOption.enableSimulcast(rid: SoraVideoOption.SimulcastRid?)` を非推奨化しました。今後は `enableSimulcast(requestRid: SoraVideoOption.SimulcastRequestRid? = null)` を利用してください
- [UPDATE] libwebrtc を 144.7559.2.2 にアップデートしました
- [UPDATE] `SoraMediaChannel.setAudioRecordingPaused` を非推奨にしました
- [UPDATE] `SoraMediaOption.enableVideoUpstream(capturer, eglContext)` の引数に `cameraConfig: SoraCameraConfig? = null` を追加しました- SoraMediaChannel.setVideoHardMute などの VideoCapturer を操作する API を利用する場合は cameraConfig を設定する必要があります
- [ADD] `SoraMediaOption` に `enableSimulcast(requestRid: SoraVideoOption.SimulcastRequestRid? = null)` メソッドを追加しました- SimulcastRequestRid は `NONE`、`R0`、`R1`、`R2` を指定できます
- [ADD] `SoraMediaOption` に `enableVideoUpstream(eglContext, cameraConfig)` を追加しました- Sora Android SDK の内部で `CameraVideoCapturer` を生成させる場合はこちらのメソッドを使います
- [ADD] `SoraMediaChannel` に `getStats` メソッドを追加しました
- [ADD] `SoraMediaChannel` に音声ミュート用の `setAudioHardMute` と `setAudioSoftMute` メソッドを追加しました
- [ADD] `SoraMediaChannel` に映像ミュート用の `setVideoHardMute` と `setVideoSoftMute` メソッドを追加しました
- [ADD] `SoraMediaChannel` に `switchCamera` と `changeCaptureFormat` メソッドを追加しました
- [ADD] `SoraMediaOption` に `SoraCameraConfig` クラスを追加しました
- [ADD] `SoraAudioOption` に `initialAudioHardMute` を追加しました
- [ADD] `SoraVideoOption` に `CaptureType` 列挙型を追加しました
- [ADD] `SoraVideoOption` に `SimulcastRequestRid` 列挙型を追加しました
- [ADD] RPC 機能を追加しました

## 2025.3.0

**日時**: 2025-11-11
**対応 Sora**: 2025.1.0 以降
**対応 Android**: 5.0 以降
**対応 libwebrtc**: 142.7444.2.1

### ハイライト

- `SoraMediaChannel` に、音声ハードミュートを有効にする `setAudioRecordingPaused` を追加しました- Android 端末のプライバシーインジケーターを消灯できる音声ミュートを実装できるようになりました
  - 詳細は [ミュート機能](mute.html) をご確認ください
- 音声データを音声トラックごとにコールバックで受け取るためのインターフェースである `AudioTrackSink` を追加しました- 送受信中の音声を音声データとして取得できるようになりました
  - 詳細は [音声データ取得機能](audio_track_sink.html) をご確認ください

### 変更履歴

- [UPDATE] libwebrtc を 142.7444.2.1 にアップデートしました
- [UPDATE] Sora Android SDK のビルドで利用する Kotlin バージョンを 2.0.20 にアップデートしました
- [ADD] `SoraMediaChannel` に `setAudioRecordingPaused` を追加しました
- [ADD] 音声データを音声トラックごとにコールバックで受け取るためのインターフェースである `AudioTrackSink` を追加しました
- [ADD] `AudioTrack` に AudioTrackSink を関連付けるためのメソッドを追加しました- `addSink`- AudioTrack と AudioTrackSink を関連付けるためのメソッドです
  - `removeSink`- AudioTrack と AudioTrackSink の関連付けを解除するためのメソッドです

## 2025.2.0

**日時**: 2025-09-17
**対応 Sora**: 2025.1.0 以降
**対応 Android**: 5.0 以降
**対応 libwebrtc**: m138.7204.0.5

### ハイライト

- `SoraMediaChannel.Listener` に、Sora から切断された際のステータスコードと理由を取得できる `onClose(SoraMediaChannel, SoraCloseEvent)` を追加しました- これにより、Sora から切断された際の理由を詳細に取得できるようになりました
  - 詳細は [Sora からの切断理由を取得できる onClose の追加](2025_1_to_2025_2.html#f803d5) を参照してください

### 破壊的変更

- シグナリング type: connect メッセージの `multistream` を自動で true に設定する仕様を廃止しました- 詳細は [シグナリングの "type": "connect" メッセージの multistream を自動で true に設定する仕様を廃止](2025_1_to_2025_2.html#afc357) を参照してください
- WebSocket が Sora から切断された際に受信したステータスコードが 1000 以外の場合でも onError を呼び出さないように変更しました- 詳細は [WebSocket が Sora から切断された際に受信したステータスコードが 1000 以外の場合でも onError を呼び出さないように変更](2025_1_to_2025_2.html#1c406d) を参照してください
- `SoraMediaOption.videoCodec` が未設定の場合のデフォルト動作を変更しました- 詳細は [SoraMediaOption.videoCodec 未設定時の動作変更](2025_1_to_2025_2.html#6eaaf1) を参照してください
- `SoraMediaOption.audioCodec` が未設定の場合のデフォルト動作を変更しました- 詳細は [SoraMediaOption.audioCodec 未設定時の動作変更](2025_1_to_2025_2.html#b31045) を参照してください
- SoraMediaChannel.Listener の `onError(SoraMediaChannel, SoraErrorReason)` を廃止しました- 詳細は [onError(SoraMediaChannel, SoraErrorReason) を廃止](2025_1_to_2025_2.html#a4cffc) を参照してください
- 解像度維持方法の fixedResolution を廃止し、 DegradationPreference を追加しました- 詳細は [解像度維持方法の fixedResolution を廃止、 DegradationPreference を追加](2025_1_to_2025_2.html#d4b577) を参照してください

### 非推奨情報

- `SoraMediaChannel.Listener` の `onClose(SoraMediaChannel)` を非推奨にしました- 今後は `onClose(SoraMediaChannel, SoraCloseEvent)` を利用してください
  - 移行方法は [Sora からの切断理由を取得できる onClose の追加](2025_1_to_2025_2.html#f803d5) を参照してください

### 変更履歴

- [CHANGE] `CameraCapturerFactory` 初期化時の引数 `fixedResolution` を廃止しました- これまでは `CameraCapturerFactory.create` の引数 `fixedResolution` に true を指定することにより送信する映像の解像度維持をすることができていましたが、この仕様を廃止しました。
  - 代替の機能として、`SoraMediaOption.degradationPreference` を追加しました
- [CHANGE] connect メッセージの `multistream` を自動で true に設定する仕様を廃止しました- `SoraMediaOption.enableSpotlight` を設定すると、内部で multistream を true に設定していましたが、この仕様を廃止しました
  - 以下の設定の組み合わに応じて自動で multistream を true に設定していましたが、この仕様を廃止しました- `enableAudioDownstream`
    - `enableVideoDownstream`
    - `enableAudioUpstream`
    - `enableVideoUpstream`
- [CHANGE] `SignalingChannelImpl` の `WebSocketListener.onClosed` の処理において、WebSocket のステータスコードが 1000 以外の場合でも `onError` を呼び出さないように変更しました- これまでの実装では、onError のコールバック呼び出しが定義されていましたが、実際には `onClosing` が実行された時点で `SignalingChannelImpl` の listener の参照が削除されるため、`onError` が確実に呼び出される保証はありませんでした
  - 今回の変更により、`onClose` においてステータスコードと切断理由を取得できるようになりエラーハンドリングが可能となったため、`onError` の呼び出しは不要となりました
  - これにより、`onError` はネットワーク切断などによる異常終了のみを通知する仕様となります
  - もし、ステータスコード 1000 以外の Sora からの切断を `onError` によって検知する実装を行っていた場合、今後は `onClose` のステータスコードを参照し、適切な処理を行う必要があります
- [CHANGE] `SoraMediaOption.videoCodec` が未設定の場合の動作変更- これまでは、`SoraMediaOption.videoCodec` が未設定の場合、connect メッセージの `video.codec_type` にデフォルトで `VP9` が設定され、送信されていました
  - 今回の変更により、未設定の場合は `video.codec_type` を送信しなくなりました
  - 未設定の場合、Sora 側でデフォルトのビデオコーデックとして `VP9` が設定されます- 参考:
  - `SoraMediaOption.videoCodec` が未設定であり、かつ `SoraMediaOption.videoVp9Params` を設定している場合は破壊的変更の影響を受けるため、明示的に `SoraMediaOption.videoCodec` に `SoraVideoOption.Codec.VP9` を設定する必要があります
- [CHANGE] `SoraMediaOption.audioCodec` が未設定の場合の動作変更- これまでは `SoraMediaOption.audioCodec` が未設定の場合、connect メッセージの `audio.codec_type` にデフォルトで `OPUS` が設定され、送信されていました
  - 今回の変更により、未設定の場合は `audio.codec_type` を送信しなくなりました
  - 未設定の場合、Sora 側でデフォルトのオーディオコーデックとして `OPUS` が設定されます- 参考:
  - `SoraMediaOption.audioCodec` が未設定であり、かつ `SoraMediaOption.audioOption.opusParams` を設定している場合は破壊的変更の影響を受けるため、明示的に `SoraMediaOption.audioCodec` に `SoraAudioOption.Codec.OPUS` を設定する必要があります
- [CHANGE] `SoraMediaChannel.Listener` の `onError(SoraMediaChannel, SoraErrorReason)` を廃止しました- `onError(SoraMediaChannel, SoraErrorReason)` を呼び出していた箇所は `onError(SoraMediaChannel, SoraErrorReason, String)` に置き換えられます
  - String にはエラーの詳細情報が渡されます- 詳細がない場合は空文字列が渡されます
- [UPDATE] libwebrtc を 138.7204.0.5 にアップデートしました
- [UPDATE] Sora 2025.1.0 でのレガシーストリーム廃止に伴い不要となる設定を非推奨に変更しました- Sora 2025.1.0 以降は connect メッセージの `multistream` 項目が廃止されました
  - これに合わせ、SDK でも `multistream` を自動で `true` に設定する挙動を廃止しました（関連: [シグナリングの "type": "connect" メッセージの multistream を自動で true に設定する仕様を廃止](2025_1_to_2025_2.html#afc357)）
  - 非推奨にした設定> - `SoraMediaOption.enableMultistream`: これまで `multistream: true` を明示するための設定でしたが、Sora 2025.1.0 以降は非推奨です
    > - `SoraMediaOption.enableLegacyStream`: これまで `multistream: false` （レガシーストリーム）を明示するための互換設定でしたが、レガシーストリーム自体が廃止されたため非推奨です
- [UPDATE] `SoraMediaChannel.Listener` に、Sora から切断された際のステータスコードと理由を取得できる `onClose(SoraMediaChannel, SoraCloseEvent)` を追加しました- Sora から切断された際に通知されるイベントである `SoraCloseEvent` を追加しました
  - WebSocket シグナリング切断時に通知されるイベントである `SignalingChannelCloseEvent` を追加しました
  - 以下の場合に、Sora から切断された際に `SoraCloseEvent` が通知されます:- SoraMediaChannel.disconnect() を呼び出した場合
    - WebSocket 経由のシグナリングを利用している場合
    - DataChannel 経由のシグナリングを利用する場合、かつ `ignore_disconnect_websocket` が true であり、かつ Sora の設定で `data_channel_signaling_close_message` が有効な場合
- [UPDATE] `SoraMediaChannel.Listener` の `onClose(SoraMediaChannel)` を非推奨にしました- 今後は `onClose(SoraMediaChannel, SoraCloseEvent)` を利用してください
- [UPDATE] compileSdk と targetSdkVersion を 36 にアップデートしました
- [UPDATE] Android Gradle Plugin (AGP) を 8.10.1 にアップデートしました
- [UPDATE] Gradle を 8.11.1 にアップデートしました
- [UPDATE] 依存ライブラリーのバージョンをアップデートしました- org.jetbrains.dokka:dokka-gradle-plugin を 1.9.20 にアップデートしました
  - com.google.code.gson:gson を 2.13.1 にアップデートしました
  - org.ajoberstar.grgit:grgit-gradle を 5.3.2 にアップデートしました
  - org.jetbrains.kotlinx:kotlinx-coroutines-android を 1.9.0 にアップデートしました
  - org.robolectric:robolectric を 4.15.1 にアップデートしました
- [ADD] `SoraMediaOption` に `degradationPreference` を追加しました- クライアント側の状況により設定した解像度やフレームレートを維持できなくなった場合にどのように質を下げるか制御できるオプションです
  - オプション追加前よりデフォルトの挙動で動作していたため互換性に影響はありません
- [ADD] サイマルキャストの映像におけるエンコーディングパラメーター `scaleResolutionDownTo` を追加しました- scaleResolutionDownTo の詳細については Sora のドキュメントの [サイマルキャスト機能](https://sora-doc.shiguredo.jp/SIMULCAST) を参照してください
- [ADD] Sora から DataChannel シグナリングを切断する際に `"type": "close"` メッセージを受信する機能を追加する- DataChannel シグナリングが有効、かつ `ignore_disconnect_websocket` が true、かつ Sora の設定で `data_channel_signaling_close_message` が有効な場合に受信可能です
  - 受信したメッセージは `SoraCloseEvent` として `onClose(SoraMediaChannel, SoraCloseEvent?)` に通知されます
- [ADD] `SoraMediaOption` に `softwareVideoEncoderOnly` を追加しました> - 映像配信時に端末のハードウェアエンコーダーを使わず、ソフトウェアエンコーダーのみで送信するためのオプションです
  > - デフォルトは false であるため互換性に影響はありません
  > - true の場合、サイマルキャスト有効時を含めソフトウェアエンコーダーのみでエンコードするようになります
  > - 映像の配信が有効な場合に適用されるため、視聴のみの場合は影響ありません
  > - `videoEncoderFactory` を設定している場合は本オプションは無視されます
  > - ソフトウェアエンコードは CPU 使用率・発熱・電力消費が増える可能性がありますので注意してください
- [FIX] `SoraMediaChannel.internalDisconnect` における `SoraMediaChannel.Listener.onClose` の呼び出しタイミングを、切断処理の完了後に修正しました- 従来は切断処理の完了前に `onClose` が呼び出されていましたが、 `onClose` は切断後に通知されるのが望ましいため、切断完了後に呼び出されるよう修正しました

## 2025.1.1

**日時**: 2025-08-07
**対応 Sora**: 2024.2.0 以降
**対応 Android**: 5.0 以降
**対応 libwebrtc**: m132.6834.5.0

- [FIX] Sora の設定が、DataChannel 経由のシグナリングの設定、かつ、WebSocket の切断を Sora への接続が切断したと判断しない設定の場合に、SDP 再交換に失敗することがある問題を修正しました- WebSocket 経由から DataChannel 経由へのシグナリング切替時に `type: switched` と `type: re-offer` をほぼ同時に受信した際、`type: re-answer` を WebSocket 経由で送信する前に WebSocket を切断してしまい `type: re-answer` の送信に失敗することがあるためです
  - DataChannel 経由へのシグナリング切替後でも、まだ WebSocket 経由で送信中のメッセージが存在する可能性を考慮し、余裕を持って切断するために 10 秒の待機時間を設けるようにしました

## 2025.1.0

**日時**: 2025-01-27
**対応 Sora**: 2024.2.0 以降
**対応 Android**: 5.0 以降
**対応 libwebrtc**: m132.6834.5.0

- [UPDATE] libwebrtc を 132.6834.5.0 にアップデートしました
- [UPDATE] SoraForwardingFilterOption 型の引数を Sora での 2025 年 12 月の廃止に向けて非推奨にしました
- [UPDATE] OfferMessage に以下の項目を追加しました- `version`
  - `simulcastMulticodec`
  - `spotlight`
  - `channelId`
  - `sessionId`
  - `audio`
  - `audioCodecType`
  - `audioBitRate`
  - `video`
  - `videoCodecType`
  - `videoBitRate`
- [UPDATE] NotificationMessage に以下の項目を追加しました- `timestamp`
  - `spotlightNumber`
  - `failedConnectionId`
  - `currentState`
  - `previousState`
- [ADD] 転送フィルター機能の設定を表すクラス `SoraForwardingFilterOption` に `name` と `priority` を追加しました
- [ADD] 転送フィルターをリスト形式で指定するためのプロパティを追加しました
- [FIX] SoraMediaChannel の `signalingMetadata` と `signalingNotifyMetadata` の Map オブジェクトに value が null のフィールドを設定した場合、そのフィールドが connect メッセージに含まれない問題を修正しました- `signalingMetadata` と `signalingNotifyMetadata` に設定する情報はユーザが任意に設定する項目であり value 値が null の情報も送信できるようにする必要がありましたが Gson は JSON シリアライズ時にデフォルトで null フィールドを無視するため、null を持つフィールドは省略されていました
  - 今後は value 値が null の情報も送信されます。値を送信したくない場合は Map オブジェクトに含めないようにしてください
