2010-01-18

AsteriskのAGIコマンドrecord_fileと回線切断時のAGIの処理指定方法

電話を使った音声録音システムを作っていて、録音中に切断して次の動作に移る処理をAGIに盛り込むにあたって、
AsteriskのAGIコマンドの中にあるrecord_fileの細かい動作を調べたのでメモ。

まずはrecord fileについて。

Usage: RECORD FILE     [offset samples] [BEEP] [s=]


record_fileの使い方は
RECORD FILE<ファイル名><録音するフォーマット(.gsmとか)><録音を中断するためのボタン(1...9と#*のDTMFを指定)><最大の録音時間を指定(msecなので注意)、-1で無制限>[(offsetについては分かりませんでした)][trueと書いておけばbeep音を鳴らして開始][音声の無音状態が指定値を超えたら録音を終了]

例:
record_file('recfile', '.gsm', "#", -1, NULL, true, NULL);



実際に録音が始まるタイミングはbeep音がなった瞬間。
beep音が鳴ると、その瞬間に指定した名前のファイル名が作成される。
なので、録音者が録音をしたかったのかどうかはAGI上でrecord_fileが呼ばれる瞬間を期に見ることで判断できる。

なるほどと思ったのは、録音を切断によって終了する場合、NTTドコモのような留守番電話サービスではファイル容量などをみて、短すぎる録音を排除する処理をしているようだ。
確かに留守番電話になって、録音せずに切断するというシーンはよくあるし、なんとなくbeep音がなるまでIVRを聞いてしまって、すぐに切断するといった事もある。
その時の1秒程度のメッセージは録音キャンセルと同義にしたほうが良いと。


それも踏まえて切断される直前と直後に次のような記述をすることで、AGIでの切断時の処理を分けることができるかもって記事を見つけた。
http://asterisk.auaudata.com/1603.html

$result = $agi->record_file('recfile', '.gsm', "#", -1, NULL, true, NULL);
if($result['result']==-1){
//回線切断時の処理
exit;
}


上記のような記述を切断時の動作を付けたいAGIコマンドにすれば良いハズ。
動作確認してないのですが、ちょっとやってみたらできなかった。
たぶん、やっぱりAGI上での回線切断の方が、if文の行よりも早く処理されてしまうからだろう。


もしくは、extensions.conf上でAGIを指定しているので、切断されたAGIが終わった後に動かしたいAGIをextensions.conf上に
exten => 201,1,AGI(first.agi)
exten => 201,n,AGI(second.agi)


とか書けば良さそう。
(追記:やっぱり無理でした。hangupは回線切断なので、完全に通話を切断してしまいます。)



その他にもDeadAGIというものがある。
exten => h,1,DeadAGI(agi-test)
のように、extensions.conf上でAGIを指定する。
するとAGIのプロセスが回線の切断と同時に強制終了されなくなる。
"h"というエクステンションは回線が切断したという意味です。
これはどうやって電話番号指定するのか分からない…わかる方がいたら教えてください。根本的にわかってないので。。



本家voip-infoに書いてあった代替案として、SIGHUPを使えと言っていました。
それぞれ言語での使い方は以下のようになってました。

Perl:
$SIG{HUP} = "IGNORE" (Perl)

PHP (though you must compile with --enable-pcntl to get this function):
pcntl_signal(SIGHUP, SIG_IGN)

Ruby:
trap('SIGHUP','IGNORE')


SIGHUPは回線が切れた時のシグナル。
これを利用して、その後の動作を指定してあげる。
ただし、phpの場合はコンパイル時にオプションを付ける必要があるので注意だそうです。



応援クリックお願いします!!人気blogランキングへ

1 件のコメント:

匿名 さんのコメント...

hの動作に電話番号は不要です。
exten -> h という動作でhangup後のcdr updateができます。