CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

Androidスマートフォンをサーバにして、複数の端末から映像+音声を確認する方法 (みまもりアプリ開発4)

前回までは、他の場所に設置したAndroidスマートフォンのカメラ映像を、別の場所で確認するアプリ開発の方法を紹介しました。

Server on Android and client browers

今回は、この機能に加えてAndroidスマートフォンの音声も一緒に伝送する機能を追加しました。
また、前回はアプリがバックグラウンドになると落ちるなど不安定になっており、それを改善したことも書いておきます。

これまでの履歴はこちらのとおりです。

www.crossroad-tech.com

www.crossroad-tech.com

www.crossroad-tech.com

使用した環境
Android Studio : 2024.3.2
Androidスマートフォン: Android 12

1. Serviceの活用

前回 (みまもりアプリ開発3) のとき、残っていた問題の中にAndroidアプリが落ちてしまうというのがありました。

問題 (まだ解決していないもの)
・スリープして復帰するととwebsocketサーバが落ちてしまう

・アプリを起動して30分未満でも、クライアント側からアクセスできないことがある

・一度サーバアプリがバックグラウンドに入ると、復帰後にアプリが落ちてしまう

これを解決するために、Serviceを使うことにしました。

Serviceとは、下記で紹介されているとおり、必要な処理をバックグラウンドで実行する方法です。

Service は、長時間実行オペレーションをバックグラウンドで実行できるアプリケーション コンポーネントです。
ユーザー インターフェースは提供されません。サービスは、ユーザーが別のアプリに切り替えた後も、しばらく実行され続けることがあります。また、コンポーネントはサービスにバインドしてサービスとやり取りしたり、プロセス間通信(IPC)を実行したりすることもできます。
たとえば、サービスはネットワーク トランザクションの処理、音楽の再生、ファイル I/O の実行、コンテンツ プロバイダとのやり取りをすべてバックグラウンドで行うことができます。

引用元:サービスの概要  |  Background work  |  Android Developers

ということで、クライアント端末の接続受付、カメラ映像とマイク音声の取得と送信をServiceの中で実行する処理に変更しました。

2. 追加・変更した機能の一覧

追加・変更対象は以下のファイルです。

Target files for video streaming on Android Studio

それぞれの行数が多く、gistでソースコードを貼っていくとものすごく長くなるため、GitHubにリポジトリを作りました。 詳細はこちらをご覧ください。

github.com

主なソースコードの役割です。

MainActivity.kt
起動、画面の描画、Websocket通信の開始と終了

CameraCapture.kt
Androidスマートフォンの映像を取得

AudioCapture.kt Androidスマートフォンのマイク音声を取得

CameraServerService.kt
Serviceとして起動し、Websocket通信関係を担当

MediaFrame.kt
映像と音声の型を定義

3. ビルドするまでの手順

ついでに、Android Studioで開いてビルドするまでの手順も書いておきます。

まず、上記のリポジトリをAndroid Studioで開きます。開くとビルド実行ツールのGradleが自動的に開始します。
Gradleについては、たとえばこちらをご覧ください。

Gradleを基本からまとめてみた【入門】 #gradle - Qiita

Gradleの実行が完了するまでは数分かかることがあります。また、build.gradleファイルを修正すると、再度Gradleのビルドが必要になります。

Gradleをビルドするには、以下の[1], [2]の順番でボタンを選択します。

How to run gradle build

Gradleのビルドが完了すると、アプリをビルド、シミュレータ実行 or 実機デプロイのための再生ボタンが表示されます。スクリーンショットの右上部分です。

もしこの三角ボタンが表示されない場合は、Gradleのビルドが失敗しています。[2]の画面右側にログが出るので、その内容に沿って修正します。

三角ボタンを押すと、シミュレータ実行 or 実機デプロイができます。

4. 動作確認

後述するマイクの問題が残っていますが、冒頭の図で示したように別の部屋からカメラ映像と音声を確認できるようになりました。

また、2台のクライアント端末 (別のスマートフォンやPCのブラウザ) から同時にアクセスして映像を見ることもできるようになりました。

クライアント端末側の表示例です。

Video and Audio Streaming Client

実際に設置してみました。不定期ですが使い始めています。

A camera app on a baby bed

5. おわりに

ひとまず、映像と音声が確認できるようになってよかったです。 ただ、マイクで取得した音声データがうまく処理できておらず、「ぱ、ぱ、ぱ、」という変な音になります。この辺は後日修正予定です。