iPhoneのソフトフォンでバックグラウンド待ち受け 【その2】 | 雲の上はいつも青空

雲の上はいつも青空

不思議な経歴をもつエンジニア!?の徒然なブログです。
お仕事関係の話が多いと思いますが、コメントとかもらえると中の人はとても喜びます(^O^)/

iPhoneで稼働するソフトフォンのバックグラウンド待ち受けの『その2』です。
Wi-Fi環境であれば、VoIPが使う帯域についてはさほど気にする必要はないのですが、3G回線経由時にはVoIPパケットの優先制御が行われませんので、なるべくビットレートを下げて通信品質が音声の品質に影響が出ないようにしたいところです。

VoIP機器でよく使われるG.711(μLow)はビットレートが64Kbpsですが、GSMが13Kbps、G.729aではなんと8Kbpsという低ビットレートです。
※実際に使う帯域はIPヘッダー部とフレーム部がありますから、G.711 で約150Kbps、G.729aでは約75Kbpsになります。ここに詳しいレポートがありました。

GSMは無料で使えますが、G.729aは特許のからみで有料です。
実際に使ってみると、GSMを使うことで3G回線経由でソフトフォンを使っても音質劣化は許容範囲だと思います(G.711 だとちょっと辛い)。

しかし、G.729aを使ってみるとGSMとの違いはよく分かります。電話がつながった最初の2~3秒が不安定になる事(毎回ではなく、たまに)を除けば、音質は問題ないと言えます。非常に安定しており、音が途切れたり、妙なエコーが発生することもありません。
※十分実用範囲に入っていると断言できます。
※iPhone用のAdd-onが1,200円、asterisk用のバイナリーcodecが$10、これが高いか安いかは微妙ですが、あの音質と一度きりの費用であると考えると、それほどコストパフォーマンスが悪いとは思いません。
$雲の上はいつも青空

それでは、G.729aを使うための設定方法です。
1-1.setting -> Add-ons で、G.729 Annex A Codecを購入する。
iTunesのパスワードを入力すると、iPhone上で購入できます。
ただし、結果が反映されて使えるようになるまで30分くらいかかります。

1-2.G729aがつかえるようになりましたら、
setting -> SIP Accounts -> [設定したいアカウントを選択] ->
Advanced settings -> Codec for 3Gを選び、G.729aを表の一番上にドラッグする。

これでiPhone側の設定は終了です。
$雲の上はいつも青空

次に、asteriskにG,729aのCodecを導入します。

まずは、astersikの開発元でもあるdigium社のWebサイトへ行き、オンラインストアからG.729aのCodecを購入します。クレジットカードかPaypalで購入が可能です。
購入自体はすぐに終わり確認のメールもすぐにやってくるのですが、ライセンスキーの発行は人力らしく、時差も手伝って次の日に送られて来ると思った方が良いです。
※オンラインストアのアカウント登録は電子メールの認証があるので、単に登録しただけではサインイン出来ません。登録後すぐにメールが送られてくるので、そこに書かれているURLをクリックすることで認証が終わり、やっとサインイン出来るようになります。

さて、手元にライセンスキーが揃ったらインストール開始です。
まずは、このページを開きInstallation GuidesにあるREADMEをしっかり読んでください。
ステップbyステップで非常に丁寧に書かれており、その通りに操作することでさほど迷わずにインストールが完了します。

まずは、registerというプログラム(Linux上で動作する。32ビット版を選んでおけば無難)でユーザ登録を行い、同時にHDD上になにやらライセンス認証用のファイルができあがります。

次はバイナリーのCodecを選択する作業です。
バイナリーなのでCPU 種類毎用意されていますが、その中でどれを使ったらよいか簡単なベンチマークを走らせて一番成績のよいバイナリーを選んでくれます。
※私の場合はなぜかC3_2でしたww

あとはダウンロードサイトへ行って、このバイナリーをダウンロードしてきます。
※実際にはブラウザー上で見えるバイナリーCodecのURLをコピーして、Linux上でwgetするのが楽です。

最後にダウンロードしてきたバイナリーCodecを /usr/lib/asterisk/modules へコピーし、
# asterisk -rx "module load codec_g729a.so"
で、初期化して組み込んでください。
※このコマンドは一度だけ実行すれば良いです。

ちゃんと新しいCodecが動いているかは、
# asterisk -rvv
*CLI> g729 show licenses

とコマンドを打つと、
0/0 encoders/decoders of 1 licensed channels are currently in use

Licenses Found:
File: G729-2NJDXXXXXXXX.lic -- Key: G729-2NJDXXXXXXXX -- Host-ID: e5:3b:4b:84:cf:45:6a:fb:9a:58:2a:6a:ec:a5:e8:5f:ae:b0:df:60 -- Channels: 1 (Expires: 2030-07-26) (OK)

こんな感じで最後に(OK)と表示されていれば、正常に動いています。

あとはsip.confの中で、iPhoneの内線に割り当てられている部分に、
disallow=all
allow=g729
allow=g722
allow=gsm
allow=ulaw
allow=alaw

という設定を書きます。
いろいろ試してみましたが、Asterisk側では使うと思われるCodecを全て書いておき、アクセスするIP電話側で使うプロトコルを一つに絞った方が良いような気がします。両方で複数書いた場合、どうも実装によって並び順が優先順位だったり、そうでなかったりするので、トラブルが出たときに切り分けがややこしくなります。

個人的にはVoIP over 3GではG.729aを使い、LAN接続のように帯域に余裕があるときはG.722がお勧めです。音質の違いがはっきり体感できます。

■ちょっと長くなりましたが、手順に沿って作業を行えばさほど時間はかかりません。
 問題はバックグランドで待ち受けするので、電池の消耗です。
※簡単にテストしてみたところ、8時間待ち受け後の電池残量は68%でした。
※しばらく実地でテストしてみて、また報告してみます。