nana開発者ブログ

音楽SNSアプリ"nana"開発チームのブログです。

nanaの新機能、ライブ配信を支える技術

初めまして!nana musicサーバーサイドエンジニアの中島と申します。

今回のテックブログでは新たにリリースされた nana LIVEについての技術的なお話をさせていただこうと思います。
そもそもnana LIVEって何という方はこちらの記事を参照ください。

nana-music.com

導入のきっかけ

さて、元々nanaにはnanaパーティという機能がありましたが、以下二点の大きな問題がありました。

①マイクが同時に一人しか持てない
②遅延が数秒ある

nana LIVEでは上記の問題を解決し、同じライブで6人までの同時配信、nanaのサウンドを流しながらマイクや音源の音量調整も行えるものとなっております。

nanaLIVEのイメージ画像

f:id:nanamusic-tech:20211117212225p:plain:w300

これを実現するために今回、Agoraを導入しました。

jp.vcube.com

Agora

大きな特徴としては低遅延であることと複数人同時通話が可能な点にあります。

プロジェクトの作成

まずはコンソールよりプロジェクトの作成をします。

Agoraのプロジェクトの作り方はとても簡単でコンソールからいくつか操作するだけで簡単に作成できます。 細かい手順につきましてはAgoraの販売代理店のv-cubeさんのドキュメントにまとまっています。*1

jp.vcube.com

tokenの発行について

tokenの発行はクライアント側に書いてしまうと秘匿情報が漏れて勝手に使われてしまいますのでサーバー側で実施します。
サンプルコードがあるので必要なファイルを落としてきて自分のプロジェクトに入れて呼び出すだけです。

github.com

nanaではバックエンドがDjangoで動いているため、Python3のファイルをプロジェクトに組み込みます。

f:id:nanamusic-tech:20211117183431p:plain

その上でこちらのコードで呼び出すだけで簡単にtokenが作成できます。

token = RtcTokenBuilder.buildTokenWithUid(
            appId=app_id, # コンソール上で作成したプロジェクトに表示されているapp_idを入れます
            appCertificate=app_certificate, # コンソール上で作成したプロジェクトに表示されているcertificateを入れます
            channelName=channel_name,  # nanaのケースではuuidをセットしています
            uid=uid, # ユーザーID(整数)をセット
            role=role, # broadcaster(配信者)の場合は1, audience(聴き手)の場合は2をセットします
            privilegeExpiredTs=privilege_expired_ts, # tokenが切れる時間をunixtimeで指定します。
        )

これをクライアントに渡してあげればサーバーサイドとしては終了です。(驚くほど簡単でした)

クライアント側でも簡単な通話ができるモック的なものをnanaに組み込むところまでは4日ぐらいでできたのではないでしょうか。
最低限のライブ配信機能は思いのほか簡単に作れました。

Agoraの詳しい使い方については実装を担当したiOS・Androidの各エンジニアが次回の記事で紹介する予定です。

今後の課題について

こうして先日リリースしたnana LIVEですが、リリースを優先するために落とした機能多々あります。

  • 自ら降板する機能
  • セットリストの順番入れ替え機能
  • 配信者や参加者の通信切断検知方法の変更

3番目についてはWebSocketの導入などによって、通信切断の検知も即座にできるなどの効果が得られるのでサーバーサイド側の腕のふるいどころだと思っています。

最後に

nana musicでは新しい技術の導入がどんどん行われております!関わってみたいとか、課題を改善していきたいというエンジニアを正社員・業務委託・副業問わず募集しております!興味のある方は是非応募をよろしくお願いします!

www.wantedly.com

*1:今回代理店として入っていただきました。サポート体制も充実しており、困ったときには質問もどんどんできるので、大変助かりました。