Asterisk AudioSocket

提供: VoIP-Info.jp
ナビゲーションに移動 検索に移動

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 – エラー:ペイロードはエラーコードを含む


注意:LEN(ペイロード長)は2byteだが、NBOなのでビッグ・エンディアン。ペイロードに乗る音声データはリトル・エンディアン。

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

*CLI> core show channeltype AudioSocket
-- Info about channel driver: AudioSocket --
  Device State: no
Presence State: no
    Indication: no
     Transfer : no
  Capabilities: (codec2|g723|ulaw|alaw|gsm|g726|g726aal2|adpcm|slin|slin12|slin16|slin24|slin32|slin44|slin48|slin96|slin192|lpc10|g729|speex|speex16|speex32|ilbc|g722|siren7|siren14|g719|opus|jpeg|png|h261|h263|h263p|h264|h265|mpeg4|vp8|vp9|red|t140|t38|silk8|silk12|silk16|silk24)
   Digit Begin: no
     Digit End: yes
    Send HTML : no
 Image Support: no
  Text Support: no

Capabilityとしては上記のようになっているが、AudioSocket側で使えるCODECはペイロードタイプで指定されるものだけ。それ以外には指定がない。(c(ulaw)とかやってみると、PT=0x10で送り出しているので、音がおかしなことになる。)

サンプル

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等もできるが、当然、音質は良くならないはず。