🎧

FiveMサーバーのデータ転送量を減らす: VoIPサーバーを分離する。

2024/10/04に公開


FiveMサーバー、特にRPサーバーではゲーム内ボイスチャットの使用がmustであり、人口の多いサーバーではVoIP(Voice over Internet Protocol)の転送量がかなりの量となる。
VPSの場合、転送量が過剰に多いと帯域幅制限をかけられてしまう。
FiveMサーバーとは別でVPSやEC2を用意し、そこにVoIPサーバーを構築する。VoIPの処理をFiveMサーバーから分離することでFiveMサーバー単体での転送量を削減することが可能である。

Mumble

FiveMサーバーはVoIP実装のために、オープンソースのVoIP SoftwareであるMumbleを使用しており、FiveMサーバーを実行するとMumbleサーバー(VoIPサーバー)も立ち上がるようになっている。FiveMクライアントはFiveMサーバーに接続後、サーバー指定のMumbleサーバーに接続する。これによりユーザー間のボイスチャットを実現している。

FiveMサーバーではこのMumbleサーバーを別の外部サーバーに設定することが可能なので、これによりFiveMサーバーとMumbleサーバーを別の環境で稼働することができる。

Mumbleサーバーを建てる

mumble-voip/mumble

Mumbleの公式実装。apt等でinstallしてすぐに環境が作れる。
FiveMクライアント内蔵のMumbleクライアントのusernameがMumblerサーバーのデフォルトのユーザーネームポリシーに反しているので/etc/mumble-server.iniを以下のように書き換える必要がある。

username=(.*)+

ただし不便な点もある。
Mumble公式実装のサーバーでは、channel作成の権限がSuperUserにしか与えられていない。
pma-voiceの場合は220 channels必要で、あらかじめ手動でGame Channel 0~Game Channel 219を作っておく必要がある。非常に面倒である。

FiveM as a Mumble

FiveMサーバーが内部で持っているMumbleサーバーの実装を使う手法。
pma-voiceを導入したFiveMサーバーを用意してserver.cfgで下記を設定する。

setr voice_externalDisallowJoin 1
setr voice_hideEndpoints 1
ConVar Default Description Parameter(s)
voice_externalDisallowJoin 0 Disables players being allowed to join the server, should only be used if you're using a FXServer as a external mumble server. int
voice_hideEndpoints 1 Hides the mumble address in logs NOTE: You should only care to hide this for a external server. int

externalDisallowJoinを設定することで、ユーザーはこのFiveMサーバーに接続することができなくなり、Mumbler Serverとしての機能だけを生かしておくことができる。

Mumbleの公式実装単体よりもfootprintが大きくなってしまうが、channel周りのことはすべて任せておけるし、FiveMが面倒みてくれてるMumble実装を使うことにもなるので安心である。

このFiveMサーバーを建てる場合はQB系のScriptや余分なMLOなどは不要と思われるので最小構成にしていいと思う。

pma-voiceに外部サーバーを指定する

FiveMサーバー(ゲームサーバー)のserver.cfg に以下を追加することで、外部Mumble ServerのIP(or Domain)とPortを指定できる。

setr voice_externalAddress <YOUR IP OR DOMAIN>
setr voice_externalPort <PORT>

Mumble公式実装のサーバーを建てたのであれば、そのサーバーのIPとポート(デフォルトなら64738)。
FiveM as a Mumbleを建てたのであれば、そのサーバーのIPとポート(デフォルトなら30120)。
それぞれを設定すれば以降VoIPは指定した別サーバーに建てたのMumbleサーバー上で行われる。

おまけ

実はmumble-voip/grumbleというMumbleのGo実装もある。Mumbleの公式実装よりもfootprintが小さいのが特徴。ただし、メンテが滞っているので安定性に難があるかもしれない。
自分もGrumbleで建てて検証してみたが、iOSのMumbleクライアントからは正常に利用できたが、AndroidのMumbleクライアント及びFiveMのMumbleクライアントでは暗号化された音声パケットの復号化に失敗してエラーがログに履かれ続けて諦めた。

Discussion