通話機能の開発秘話
こんにちは!ネイティブ・Unity事業部の山中です。
弊社で2014年12月にスタートークでリリースした通話機能ですが、中で使用している技術がなかなか他では使われていないものなのでご紹介したいと思います。
スタートーク
弊社で公開しているトークアプリです。
WebRTCで通話
公式デモ
もともとPCブラウザでビデオチャットやファイル共有などを容易に実装できるAPIのことです。
GoogleCode上で開発されており、AndroidやiOSでの実装も公開されています。
スタートークの通話はこれを使って実装されています。
VoIP+SIPなどで実装されたスマホの通話機能は事例がありますが、WebRTCで、しかもスマホで開発されたものは他にあまりないと思います。
常に新しいことに挑戦する会社、トライフォートだからこそできたものです。
WebRTCとは
・ブラウザ間で特定のプラグイン無しにボイスチャット、ビデオチャット、ファイル共有等ができる
・JavaScriptを200行くらい書いたらビデオチャットが作れる
・W3Cにより標準化が進められ、開発はGoogle主導で今も頻繁に更新されている
・各ブラウザ対応状況
Chrome・Firefox・Opera・Android Chrome・Lolipop以降のAndroidブラウザが対応
iOS・IE・Safariは未対応
WebRTCがどういう技術なのか、詳細な説明は今回は省略します。
ここからはトライフォートにおいてWebRTCをスマホのネイティブアプリとして使用した経緯、それにまつわることなどを書いていきたいと思います。
こちらのスライドに以前勉強会で解説した内容があります。
なぜWebRTCを選んだか
スマホで通話を実装する場合、VoIP+SIPなどで開発をすることが多いです。
既存の通話アプリの多くはVoIP+SIPで実装されてますが、そのやり方ではエンジニアとしての挑戦のしがいもなく電話と紐づけることが多くiPod touchをはじめタブレットなど電話番号を持たない端末を持ったユーザーには不便だと思いました。
また、実装技術を選択する前に、オープンソースのライブラリを使ってそれぞれデモアプリを作り、音質やできることできないことを比較検討しました。
それによって下記がメリットとして上がったので、WebRTCの開発に踏み切りました。
WebRTCのメリット
・PCへの移植が容易
WebRTCは元々がブラウザ間での技術です。
その為PC向けにも通話を提供する際、移植が容易であるという利点があります。
・バックグラウンドでの常時接続が不要
VoIP+SIPはアプリが起動していなくても裏で常にサーバーと接続(ポーリング)し、相手からの呼び出しを待ち受ける必要があります。
その場合サーバが大量の接続により高負荷になることが懸念されますが、WebRTCでの通話はネイティブに含まれているプッシュ通知を起点に通話が始まる為、そういったことが必要ありません。
・NAT越えの実装が容易
NATとはルータやモデムなどの、インターネットとスマホ端末をつなぐ間に存在する技術の総称です。
これを実装しないと、違うLAN内にいるデバイスとの通話が成り立ちません。
NAT越えの技術ではICEなどがありますが、VoIP+SIPではそれを一から実装しなければなりません。
WebRTCの場合はSTUNサーバを指定するだけで済みます。
開発の流れ
デモの改変
まず、サンプルとして公開されている実装があるので、それを改変していきました。
最初に参考にしたのは
・Android – https://github.com/noiges/webrtc-android-demo
・iOS – https://github.com/gandg/webrtc-ios
です。
そのまま落としてビルドすれば、ある程度のベンチマークが取れると思います(Androidは動作する端末が限られますが)
※これは上にも書いた公式デモにネイティブアプリとしてアクセスできるもので、googleが開発している公式のソースをビルドしたものです。
弊社でビルドし、社内で実際に下記のようなテストケースで通話してみて既存の通話アプリと比較しても遜色のない通話品質で通話できることを確認しました。
・iOS:Wi-Fi <—-> iOS:Wi-Fi
・Android:Wi-Fi <—-> iOS:Wi-Fi
・Android:Wi-Fi <—-> Android:Wi-Fi
・Android:3G <—-> iOS:Wi-Fi
・Android:3G <—-> Android:Wi-Fi
・iOS:3G <—-> iOS:3G
・Android:3G <—-> Android:3G
サーバーを自社で用意
自社アプリとしてWebRTCを使用するに当たって、下記のサーバーも必要になります。
・シグナリングサーバー
・STUNサーバー
シグナリングにはスタートークで使っているSocket.IOを用い、STUNサーバーにはrfc5766-turn-serverを利用しています。
STUNサーバーはNAT越えの為に必要で、デモアプリではGoogleのサーバーに接続するようになっています。
スタートークのシステムへの組み込み
実際に認証などを実装してアプリに組み込みました。
また、参考にしたデモではビデオチャットも含まれていますが、現段階では映像の送信部分は機能をオフにしてあります。
Androidの動作端末が少ない問題
デモアプリをそのまま使うと、音声データの取得周りで
Error(webrtcvideoengine.cc:1382): webrtc: InitSampleRate: InitRecording failed (-1)
のようなエラーが起きて強制終了する端末がほとんどでした。
WebRTCの実装は膨大で大部分がCのソースで書かれておりその中のどこかでエラーが起きているようでした。
これを回避するべく、公式のサイトから元のCソースを落として中身を書き換え、ビルドして.soファイルを差し替えてようやく動くようになりました。
ビルドの手順はこのレポジトリの手順をそのままやればビルドできます。
公式サイトの手順にも書いてありますが、Ubuntuの仮想マシンがオススメです。
ビルドに必要な容量とメモリが非常に大きい(20GB・2GB)ので注意してください。
まとめ
スマホネイティブにおけるWebRTCで通話機能を作ろうというのが弊社で初めての試みだったので、情報収集が大変でした。
WebRTC自体が2012年頃から出始めた技術なので、アプリに使われている事例は少なく、日本においてここまで大々的に使っているのはチャットアプリでもスタートークだけと言っても過言ではないと思います。(2014年12月リリース時点)
トライフォートでは新しい技術をどんどん取り入れる社風なので、そういったところにも興味を持って頂ければなと思います。
自分もWebRTC Meetup Tokyoなどには顔を出そうと思いますので、興味のある方は是非、イベントで会いましょう。