Windows向け省帯域リモートデスクトップシステム (クライアントはAndroid) の開発中お試し版を配布してみます

何?

  • 出先で、モバイルデバイス(主にはスマートフォン)を使ってモバイルネットワーク経由で自宅PCにインストールしてある音声付きノベルゲームをやれたらいいな、と思った
  • Windows公式リモートデスクトップとかだとパケ死するので、ダメ
  • 利用したいアプリケーションの特性(画面の大部分は頻繁には更新されない)を考慮すると、FPSを落とすとか、全画面表示にしておけば画質を落としても何とかなるのでは?と考えた
  • 画像・音声の両方に対応していて、画質やFPSを極端に落とせるソフトウェアは見つからなかった
  • ので自分で作ることにした
  • まとめると、すげえ馬鹿みたいに画質やFPSを落とせて、結果的に省帯域で使えるリモートデスクトップシステム(サーバ、クライアントとなるAndroidアプリ)です!

作り

頑張った・苦労したところ

  • 画像 (動画) と 音声の エンドレスなライブエンコーディング・デコーディングを実装した
    • 画像はH264、音声はOpus
    • 英語で書かれたものも含めてインターネッツにあまり情報がない
    • Android組み込みのデコーダの初期化のしかたがとにかく良く分からない。トライアンドエラーでなんとかした
    • 音声は最初にAACで実装したが、レイテンシ(要はエンコーディング・デコーディングにかかる処理時間)が大きすぎて使い物にならず、作り直しになった
      • コーデックによって結構違うんだなあと、勉強になりました
  • クライアント側は大部分をXamarin.Forms (プラットフォーム非依存でUI含めて実装できる) で書いた
    • 音声デバイス回り、メディアデータのデコーダがプラットフォーム依存な形で実装されているが、そこさえ対応すればiOSアプリにもできる(簡単じゃないと思うけど・・・・)
  • タッチパネルでのマウス操作をまともに使えるレベルの仕様(実装とは言っていない)で作った

未実装の機能などなど(これから実装しないといけないところ)

  • クライアント側からFPS、画質、音質を設定できるようにする
  • サーバ側の設定の外部ファイル化
  • サーバにグローバルIPでアクセスしても動作するように (インターネットアクセス権限の取得処理)
  • (できたら・・・、)UDPホールパンチング等を用いてVPN無しで出先でのモバイルネットワークからNAT内のサーバにアクセスできるようにする
    • 今のところ、Hamachiなどを用いて自宅のPCとVPNを張ってもらうしかない

配布ファイル

クライアントのapkパッケージも、拡張子がapkだとスマホブラウザでダウンロードした時に開くアプリとかで面倒なことになったりするみたいなので、zipで固めてあります。
展開して中のapkパッケージをインストールしてください。
なお、Google Play経由でのインストールではないので、以下のページで説明されているような手順でのインストールが必要になります。
https://qiita.com/gumby/items/9e1431b73bdb6b0684d8

上記で配布しているバージョン1.1に対応するコードは以下です。
GitHub - ryogrid/RemoteDesktopOneWindowForNovelGrame at d18f7ede53d73216bf5041959501a63ba741eb29

動作環境

サーバ

  • Windows10 64bitでのみ動作確認していますが、Windows7以降 (64bit) ぐらいなら動作するのではないかと思います
  • .Net Framework v4.6.1をターゲットにビルドしてあるため、そのバージョンと互換性のある環境であれば動作可能なはず
  • ポートは10010番と10011番を利用します

クライアント(Androidアプリ)

ネットワーク

  • Hamachi等のVPNを用いても良いのですが、同一ネットワークに存在する状態でないと動作しないと思います(インターネットアクセスの権限取得などの処理を実装していないため)

注意

  • サーバとクライアントの間の通信は暗号化されません
  • クライアントアプリはバックグラウンドにいったときの処理が未実装のため、終了させずに他のアプリに切り替えると、異常動作をするのではないかと思います!!!
  • 省帯域というのを示したいので、画質はかなり落としてあります。正直、今のパラメータだと実用に耐えないと思います

お願い

  • うまく動作しなかった場合は、コメント欄にOSのバージョンとデバイスの機種名(クライアント側の場合のみ)、また可能ならどのような現象が発生したかをご報告いただけると大変ありがたいです

使い方

サーバ

zipファイルを展開して、RemoteDesktop.Server.XamaOK.exe をファイルエクスプローラなりコマンドプロンプトなりで起動すれば使えます。

コマンドプロンプトが追加で開きますが、そこにはサーバの標準出力が出ています。

終了するときは、上記のコマンドプロンプトを閉じるか、タスクマネージャなりでプロセスを終了させればOKです。
動作させるPCの設定を変更したり、ファイルを生成したりすることはありません。
従って、アンインストールはフォルダを削除すればOKです。

機能・処理
  • PCのメインスクリーンの内容をキャプチャしてクライアントに配信する(1秒おき)
  • PC内で流れている?サウンドをクライアントに配信する
  • クライアントからのマウス操作を、マウスカーソルに適用する

クライアント(Androidアプリ)

  1. 起動したらIPアドレス入力フォームがあるので、それにタッチしてフォーカスをあててサーバのIPアドレスを入力
  2. 左上の「三」みたいなのを押して、RDPSessionを選択 => サーバへ接続が開始され、画像と音声が送られてきます
  3. リモート操作は現状、マウスのみ対応です。PC画面はスマホを横にした状態で見える形で表示されます。タッチしたまま指を移動させるとカーソルが連動して動きます。タップすると左クリック。ロングタップで右クリックです。ダブルクリックはタップ2回ですが、あまり速いとうまく認識されないので、ゆっくりめを意識してやってみてください
  4. 終了のさせかた。終了ボタンとかはないので、Androidの□ボタンとかで起動中のアプリを出してシュッとするとかで終了させて下さい