2024.12.24
「経営陣が見たい数字」が見えない状況からの脱却法 経営課題を解決に導く、オファリングサービスの特長
LINE LIVE クライアントアプリの配信技術(全1記事)
提供:LINE株式会社
リンクをコピー
記事をブックマーク
岩谷明氏(以下、岩谷):みなさんこんにちは。LINE LIVEのAndroid アプリを作っている岩谷と申します。先ほどサーバーサイド寄りの話がありましたので、今回はクライアントの話をしたいと思います。よろしくお願いします。
簡単にアプリの機能について説明したあとに、どのように作ったかを説明したいと思います。また、低レイヤーを担っているYukiという社内製のモジュールもあるので、それも簡単に紹介したいと思います。
アプリは2015年末にバージョン1.0が出て、現在バージョン3.16が出ています。年に1回ぐらいメジャーバージョンがあるような感じです。現在も次のバージョンを開発中です。
まず、動画を見る「プレイヤー」という画面がメイン機能としてあります。同じ機能がLINEのアプリの中にも搭載されていて、LINEのトークルームから直接LINE LIVEを見ることができるようになっています。アプリだけにある機能として、配信画面がありますが、今回はこれについてお話ししたいと思います。他には、ホーム画面やマイページ、検索画面があります。
アプリに使われている技術ですが、iOSは100パーセントSwiftで作り始めました。非同期の処理にはPromiseKitを使っていて、配信まわりはReSwiftというReduxのライブラリを使っています。APIコールはAPIKitを使っています。
AndroidはKotlinをガシガシ使っています。もともとJavaで書いていたんですが、KotlinがGoogleI/Oで正式に発表された頃に導入し、ようやく約30パーセントがKotlinになりました。非同期処理はほぼすべてRxJava2を使っていて、通信まわりもRetrofit2とOkHttp3のよくある構成になってます。DIコンテナはDagger2を使っています。
よくあるのが、LINEアプリのプレイヤーとLIVEアプリのプレイヤーで、同じ機能でユーザーの情報を取る仕組みが異なるといったケースで、異なる依存するコンポーネントをDagger2でインジェクトするようなかたちで便利に使っています。
アーキテクチャは主にMVVMで、配信画面はReduxを使っています。
機能としては、動画再生するところと、チャットと、先ほど話があった応援アイテムや、ランキング、そして「ハート」という仕組みで応援ができるようになっています。
この動画はHLSになっていて、iOSだとOS標準のAVPlayer、AndroidではExoPlayerを使っています。ですが、一部の古い端末ではExoPlayerが動かないことがたまにあるので、そういう時はMediaPlayerを使うようにしています。ですが最近ではこの仕組みもいらなくなってきたと感じています。OS4.4以前の古い端末ではExoPlayeが使えないので、古いOSをサポートしていた頃の名残みたいな感じになっています。
チャットは先ほど話がありましたが、全部のチャットを合計すると5億件くらいのメッセージが流れることあります。もちろん1つのクライアントに1億メッセージ入ってくるような事態では、アプリが正常に動作しないので、そうならないようにサーバーサイドで調整しています。ですが、それにしても大量のチャットが入ってきます。また、応援アイテムはすべてクライアントに届くようになっているので、最大で1分6,000個くらい送られる配信もあります。チャットの仕組みはWebSocketを使って実現していて、弊社のブログに詳しい記事(LINE LIVE チャット機能を支えるアーキテクチャ)があるので、興味のある方はご覧ください。
応援アイテムは、アニメーションが付いていて、楽しくかわいく盛り上げることができます。このアニメーションはAnimation PNG(APNG)を使っています。
APNGを再生するために、iOSではAPNGKit、AndroidではApngDrawableというライブラリを使っています。どちらも弊社のエンジニアが開発したものです。みなさんもぜひ使っていただけると幸いです。
次は配信画面です。
リアルタイムのライブ配信をするのですが、ユーザーの配信者のネットワーク環境に応じて適切なビットレートを選んでいます。あとは、Face stickersという、顔をかわいくしたり、猫にしたりするStickerがだいたい170個ぐらい使えます。また、カラーフィルターをかけて肌が綺麗になったり、トーンが変わったりしたライブができるようになっています。
他にはコラボ配信機能に対応しています。配信をしている他のユーザーにコラボ配信のリクエストを送ってリクエストが許可されると、その配信者の横に小さい画面で、コラボ配信したい人の画面が写り、視聴者は2人の様子を見て楽しめるようになっています。
最近はカラオケ機能・Music機能もつきました。ライブ中に歌詞が流れて、一緒に歌って、声にエコーかけることもできる機能です。ぜひ試してみてください。
配信のアーキテクチャについてです。
まずアプリでユーザーが配信を始めると、RTMPのパケットがStreaming Serverに送られて、HLSにトランスコーディングされ、それをCDN経由でプレイヤーが受け取るかたちになっています。ただ受け取るだけでなく、LIVEを配信するステータスや、急に強制的に終了してしまった場合などのハンドリングも含めて、APIサーバに10秒に1回ぐらいポーリングしていて、最新の状態を、配信画面と視聴者のプレイヤーで同期しています。
その配信部分をどうやってクライアント側で実装しているのかですが、もちろんiOS、Android両方の実装がありまして、次にその先ほどお話しした「Yuki」という社内製のライブラリが、かなり多くの部分を担当しています。
UIやYukiを制御する、アプリケーションのコードは両OSともReduxのアーキテクチャになっていて、iOSではReSwiftというライブラリ、AndroidではKotlin+RxJava2を使った独自の実装になっています。
ユーザーの入力やサーバーのポーリングの情報、YukiからくるRTMPのステータスや、Face stickersの情報などとといったコールバックの処理、カラオケのMusicが何秒間再生されて、歌詞はどこを表示するかなど、一つの画面内でリアルタイムに様々なことを更新しなければいけないので、Reduxアーキテクチャを採用しています。
ユーザーの入力があったら、Actionというかたちで表現され、それがReducerを通してStateに反映され、また画面に反映されます。APIコールなどの非同期処理には、RxJSを元にしたRedux実装であるredux-observableで採用されているEpicという仕組みを採用しています。Actionが送られると非同期処理を行いその結果がActionとして出力される仕組みです(Android)。
Yukiは、ほぼC++で書かれた画像処理やカメラで撮影した映像を配信してくれる社内製のモジュールで、これはまた別の専属チームが作っています。
YukiはLINEにも搭載されていますし、LINE LIVEにも搭載されています。最近のLINEでは、ビデオ電話中に顔にステッカーを付けたりできるのですが、その機能もYukiが提供しています。
最近搭載された「Character Effects」という新機能は、顔を動かすと表情によってキャラクターが変化します。あとは、先ほどの配信機能や顔を変形する機能、AR、カラオケなど、様々な同画像処理をサポートしているライブラリになっています。
Yukiの構成も簡単に説明します。
C++のレベルでほとんどの機能が実装されていて、エフェクトをかける部分や、ネットワーク処理をする部分などがあり、その上にプラットフォームで固有の実装が存在して、直接デバイスのカメラを触るような処理や、ステッカーをユーザーがダウンロードする機能、画面にプレビューを反映させる部分などがあります。各モジュールが疎結合で動くようになっていますが、ライブ配信部分は、その両方が絡んでいます。
実際にRTMPをどうやって送るかという部分を一例に出しますと、このようになっています。
DeviceのCamera、Microphoneから入力されたものが、Mixerで、カラオケなどの場合は音楽も含めて合成したり、Face stickersが付いてる場合はさらに画像を重ねたりします。それをH264EncoderとAACEncoderがエンコードして、ネットワークで送る用のヘッダやパケットを組み立てて、プロトコルはRTMPで、実際にCommunicatorと呼ばれるモジュールがネットワーク通信をする構成です。
まとめますと、かなり多種多様なコンポーネントを社内で開発していて、LINE LIVEはその上で動いています。各チームは各チームのモジュールに集中してがんばり、それを僕らが組み立てて作る感じです。様々なモジュールやAPI、UIをまとめ、使いやすいアプリと作りやすいコードを育てるためにReduxやMVVMなどのモバイルアーキテクチャを活用・模索しています。時代の流れに追従しつつ、3年・4年くらい模索していますが、まだまだ新機能を開発中で、これからもさらに良いアプリ・良いコードにしたいと考えています。
以上です。ありがとうございました。
(会場拍手)
LINE株式会社
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.20
「資格のかけ算」で切り開くキャリア戦略 4パターンの資格の組み合わせで自分の強みを最大化するヒント
2024.12.23
DMM亀山会長が語る、事業撤退の見極め 600もの事業に挑戦した中でロジックよりも大事にしていたこと
2024.12.24
なぜ「場当たり的」なタスク処理になるのか? マッキンゼー流、「優先順位づけ」のポイント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」