大人気動画コミュニティアプリの運用の内幕―MixChannel(ミクチャ)を支える技術

最終回 Android 端末におけるライブ配信サービスの実現(後編)

この記事を読むのに必要な時間:およそ 2 分

前編では,ライブ配信機能の実装などについて解説を行いました。後編では視聴機能の実装と運用について解説します。

ライブ視聴機能の実装

ここでは,配信されたライブを受け取り,視聴者の端末へと出力する機能について紹介します。MixChannelのライブ視聴機能は図1のとおりです。

図1 Android版MixChannelのライブ視聴機能

図1 Android版MixChannelのライブ視聴機能

プレイヤについて簡単に紹介すると,Androidにおける標準的なプレイヤとしてはandroid.media.MediaPlayerがありますが,MixChannelではExoPlayerを使用しています。ExoPlayerはGoogleにより開発されたAndroid用メディア再生機構で,android.media.MediaPlayerと比べるとカスタマイズ性の高さやアップデート頻度の高さに特徴があります。ExoPlayerの機構を1つ紹介すると,SimpleExoPlayerViewが便利です。これはプレイヤ実装に必要となるView関連の処理が詰まったクラスで,TextureViewとDataSourceのつなぎ込み処理や,シークバーや再生/停止ボタンなどのUI実装など,Viewに関する多くの処理を任せることができるため,プレイヤで複雑な制御が必要ない場合においては,実装工数の削減に大きく貢献してくれます。

続いては,プレイヤのエラーハンドリングについて紹介します。ライブ視聴機能は,視聴者のネットワークのみならず,配信者のネットワークにも依存するため,安定して提供するのが難しいことがあります。映像の再生が止まったり,ローディングが長く続いてしまったり,というような,ユーザーにストレスを与えてしまう状況においては,適切なメッセージを表示することがストレスの低減につながります。以下では,MixChannelでハンドリングしているエラーの内容と,そのハンドリング方法について紹介します。

1.ネットワークをロストした

一番わかりやすいエラーです。視聴端末が圏外になったときや,Wi-Fiが一時的に不安定になったときなどに発生します。このケースでは,ExoPlayerによりスローされるHttpDataSourceExceptionをキャッチし,⁠ネットワークを探しています」といったメッセージを表示しつつ,定期的な再接続を試みます。

2.接続先をロストした

配信者からのストリーミング映像が途絶えたとき,もしくは,サーバ上のキャッシュが破棄されたときに発生します。このケースでは,ExoPlayerによりスローされるInvalidResponseCodeExceptionをキャッチし,レスポンスコードが403であることを確認したうえで,⁠配信を探しています」と表示します。あるいは,配信者によりライブ配信終了の操作が行われていた場合は,⁠配信は終了しました」と表示し,再接続を行いません。

3.同じ映像を何度も受信した

配信者からのストリーミング映像が途絶えたが,サーバ上にキャッシュが残っているときに発生します。やっかいなことに,このケースにおいてExoPlayerはExceptionをスローしません。そのためMixChannelでは,映像データのパーサをカスタマイズし,同じIDの映像が続いていないかどうかの判別処理を追加しています。同じ映像が続いたときは,その映像の再生処理をスキップし,⁠配信の再開を待っています」というメッセージを表示します。

4.映像のダウンロードに時間がかかっている

視聴端末のネットワーク環境が悪いときに発生します。このケースでは,ExoPlayerによりスローされるBehindLiveWindowExceptionをキャッチし,⁠データの受信に時間がかかっています」というメッセージを表示します。

運用してみてわかったこと

Android版MixChannelのライブ配信機能は1年半の運用を経て,いくつかの問題に直面し,それらに対応してきました。問題の中には,運用する前に気づけたものや,逆に絶対気づけないだろうとさじを投げたくなるようなものがありました。ここではそれらの一部を紹介します。

問題1.ライブを始めるとクラッシュする

ある種類の端末においてのみ,⁠ライブを始めると落ちる」というお問い合わせが続いたことがありました。調べてみた結果,この端末はH.264形式のエンコードに対応しておらず,H.264以外の形式を想定していなかった動画エンコーダがクラッシュを引き起こしていました。H.264の代わりにH.263形式のエンコードには対応していた同端末でしたが,ライブ配信機能をH.263形式にも対応させるコストは高すぎるという判断に至ったため,⁠一部の端末はライブができない」という仕様を追加するという対応を取りました。Googleによる端末要件上ではクリアしていても,テストは必要だと反省した一件でした。

問題2.ライブの一部が緑色になる

ある種類の端末を通して行われた配信があって,その視聴映像に緑色の矩形が映り込むという問題が起こったことがありました。映り込むのは視聴映像のみであり,配信者のスクリーンには映り込んでいない様子だったので,映像データのエンコードより先のどこかに原因があるだろうという予想はついたのですが,原因を突き止めることはできませんでした。それでも,低い解像度の映像データでは発生しないことがわかったので,端末性能に応じて解像度を変化させる実装を行い,対応完了としました。

古い端末への対応について

MixChannelのライブ配信機能はAndroid 4.4以降の端末で利用可能となっています。4.4より前の端末での利用を実現できなかった背景には,処理性能の問題,およびエンコーダの問題があります。

先に紹介したMediaCodecによるエンコードは,Android 4.3から利用可能なAndroid標準の機能です。MediaCodecは,端末によってハードウェアエンコーダの振る舞いに違いがあるというAndroid特有の問題を解決し,ハードウェアエンコーダに左右されないエンコードインタフェースを提供します。MediaCodecを使用しないライブ配信機能の実現を考えてみると,リアルタイム性への影響によりソフトウェアエンコーダは使えず,ハードウェアエンコーダ一種一種へと対応していく必要があり,その実装コストは非常に高くなります。仮にエンコーダ面の問題が解決できても性能面の問題が待っているということもあり,MixChannelではAndroid 4.3以前におけるライブ配信機能の実現を見送りました。MediaCodecには対応しているAndroid4.3においても実現できなかったのは,検証の結果性能面に大きな問題があったためです。

おわりに

今回も2回に分けて,Android版MixChannelのライブ配信機能の裏側について紹介しました。MixChannelの連載は今回で最後となります。弊社ではエンジニアの採用を積極的に進めておりますので,MixChannelの開発に興味が湧いたら,ぜひ一言お声掛けください。

Donutsでは,現在エンジニアを募集しています。詳しくは,
https://www.donuts.ne.jp/recruit/career/
https://recruit.jobcan.jp/donuts/list?category_id=7548
をご覧ください。

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.109

2019年2月23日発売
B5判/168ページ
定価(本体1,480円+税)
ISBN978-4-297-10440-5

  • 特集1
    [Fastlyで柔軟&高機能!]
    最新CDN入門
    高速化,エッジコンピューティング,セキュリティ強化
  • 特集2
    [実践]Kotlin
    基本からSpring,Java資産活用まで
  • 特集3
    [速習]Puppeteer
    ヘッドレスChromeでテスト&スクレイピング
  • 一般記事
    [コミッター直伝]
    Ruby 2.6徹底解剖
    追加機能,変更点,Ruby 3に向けた準備

著者プロフィール

Takase Ryohei

豊橋技術科学大学大学院を修了後,株式会社DonutsでMixChannelのAndroid開発に携わる。


Ari Prasetyo

東京大学工学部を卒業後,株式会社DonutsでMixChannelのAndroid開発に携わる。

コメント

コメントの記入