Asterisk AudioSocket
Asterisk 18~で実装されたTCPベースの『簡単な』オーディオ・ストリーム入出力。
アプリケーション(app_audiosocket)とチャネルドライバ(chan_audiosocket)があるので注意。CODEC指定が可能なのはチャネルドライバのみ。
データフォーマット
0 1 2 3..... PT LEN LEN Payload
PT-ペイロードタイプ
LEN-ペイロード長(2byte)
Payload-ペイロード本体
最小のデータは切断(0x00,0x00,0x00)の3byte
ペイロードタイプ
注意:appで使えるのはPT=0x10の16bit 8kHzのみ。
0x00 – 切断(ソケットのクローズでも可) 0x01 – ペイロードはUUID(16byteバイナリ) 0x03 – ペイロードは1byte の DTMF(ASCII) 0x10 – ペイロードは符号付リニア, 16-bit, 8kHz, モノラル PCM 0x11 – ペイロードは符号付リニア, 16-bit, 12kHz, モノラル PCM 0x12 – ペイロードは符号付リニア, 16-bit, 16kHz, モノラル PCM 0x13 – ペイロードは符号付リニア, 16-bit, 24kHz, モノラル PCM 0x14 - ペイロードは符号付リニア, 16-bit, 32kHz, モノラル PCM 0x15 - ペイロードは符号付リニア, 16-bit, 44.1kHz, モノラル PCM 0x16 - ペイロードは符号付リニア, 16-bit, 48kHz, モノラル PCM 0x17 - ペイロードは符号付リニア, 16-bit, 96kHz, モノラル PCM 0x18 - ペイロードは符号付リニア, 16-bit, 192kHz, モノラルPCM 0xff – エラー:ペイロードはエラーコードを含む
app_audiosocket
サンプル
exten => 7000,1,NoOp
exten => 7000,n,Answer()
exten => 7000,n,Set(MYUUID=${UUID()})
exten => 7000,n,Audiosocket(${MYUUID},127.0.0.1:9093)
exten => 7000,n,Hangup
UUID形式で識別子を送出する必要がある。
app_audiosocketはオートアンサしないので明示Answer()する必要がある。
chan_audiosocket
サンプル
exten => 7000,1,NoOp
exten => 7000,n,Set(MYUUID=${UUID()})
exten => 7000,n,Dial(Audiosocket/127.0.0.1:9093/${MYUUID}/c(slin48))
exten => 7000,n,Hangup
テストコード
Audiosocketで受信し、単純エコーバックするだけのコード。
https://github.com/takao-t/asterisk-experimental/tree/main/audiosocket
ヘッダを正しく処理すれば何の問題もなく簡単に使える単なるTCPのストーリームオーディオ。ただし、実際に試した範囲では以下の制限がある模様。
- Asterisk「が」受け取るストリームはUUIDやDTMFは受け付けられず、オーディオストリームだけの模様。
- つまりAsteriskはAudioSocketでDTMFは受け取れない(みなし音声、インバンドならいけるかも?)。
- uLawの電話機からAudiosocketのSlin 48kHz等もできるが、当然、音質は良くならないはず。