🍲

ライブ配信視聴機能改善の取り組みまとめ

に公開

ライブ配信視聴機能改善の取り組みまとめ

以前在籍していた会社におけるライブ配信視聴機能は、主に外注先によって開発されたものであり、導入当初から安定性に課題がありました。入社後、可能な範囲でパフォーマンス改善に取り組んだ際の記録を以下に記載します。
2021年〜2022年頃(Agora SDK 3.x系時代)のメモとなるため、一部の詳細を十分に記憶しておらず、深く分析できていない箇所もありますが、ご参考になれば幸いです。

パフォーマンス劣化(UIのカクつき・遅延)

ライブ配信画面に遷移すると、UIがガタつき全体的に重くなる事象が発生していました。

  • View Hierarchy Debuggerにて調査したところ、ビュー階層が過度に深く、初期表示が遅延
  • 前画面のビューおよび関連リソースが正しく解放されていないことが判明

対策として、画面ライフサイクル処理を見直し、不要リソースが確実に破棄されるよう修正したことで、初期表示パフォーマンスが改善しました。

配信時の端末発熱とクラッシュ

高負荷による発熱

古い世代の端末(例: iPhone 7)では、配信を続けると短時間で端末温度が上昇し、過熱保護によってアプリが強制終了する問題が多発していました。XcodeのEnergy Reportでは常に "Very High" のレベルを示していました。
対策として、Agora公式ドキュメントを参照し、以下の設定を見直しました。

  • デフォルトの解像度を下げる
  • FPS(フレームレート)を適正値に調整

調整後は発熱が一定程度改善され、その後は配信者自身が端末性能や電波状況に応じて解像度を選択できるよう機能追加も行いました。

RTMの切断漏れ

発熱問題調査中に、配信終了後もRTMが退室されていないバグを発見しました。

短期的には大きな問題を引き起こさないものの、継続すると負荷増加やメッセージ送受信障害の原因となる可能性があるため、RTC/RTM双方が確実に終了処理されるよう修正しました。

特定のタイミングでのクラッシュ

FaceUnity併用のAgora公式デモをベースにしていたため、特定状況下でまれにクラッシュが発生し、Firebaseでも最も多いクラッシュとして検出されていました。再現率は100%ではなくレアケースでしたが、公式デモでも同様のクラッシュが確認されました。
CapturerManagerの関連delegate処理をステップ実行した結果、

  • まだ生成されていない映像フレームに対して処理が行われている
  • 黒画面状態で処理が進みクラッシュに至る

という原因を特定し、該当箇所のコード2行の順序入れ替えによって解決しました。
なお、現在のAgora SDKおよびFaceUnityの最新バージョンで同事象が解消されているかどうかは未確認です。

映像が映らない(黒画面)問題

黒画面は複数原因が存在しました。

初期化の競合

RTC初期化が描画ビュー初期化より先に行われる可能性があり、非同期処理の関係で初期化順序が乱れる場合がありました。この結果映像プレビューは見えても、実際には映像がAgora側へ渡っておらず、視聴者側では黒画面となっていました。初期化順序を制御することで改善しました。

再接続時の不整合

エラー発生時に画面破棄やRTC/RTM切断が正しく行われず、その後の再接続時に黒画面となることが確認されました。終了処理の正当性チェックを強化して解消しました。

ラジオ配信時の画質劣化

ラジオ配信では映像が不要なため、配信画面には静止画像のみを利用していました。そのためアプリ側の実装として、画像フレームの送信頻度を意図的に低く設定していました。しかし、その状態が10〜20分続くと、画像の画質が大きく劣化してしまう問題が発生しました。

フレーム送信頻度が極端に下がると、Agora側がネットワーク品質の低下と誤認し、配信停止を回避するために自動的に映像品質を下げる挙動が確認されました。

対策としてラジオ配信用の送信ポリシーを見直し、適切な送信頻度を維持するよう修正したことで画質劣化が改善されました。

おわりに

ライブ配信視聴に問題が発生した際には、配信者側と視聴者側のどちらに起因する事象なのかを切り分けることが極めて重要だと実感しました。現在のアプリにもライブ配信視聴機能が存在するため、過去に経験した問題と対策を記録として残しておくことは、同様のトラブルを未然に防ぎ、より安定したサービス提供につながると考えています。

SKIYAKI Tech Blog

Discussion