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 – エラー:ペイロードはエラーコードを含む
注意: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等もできるが、当然、音質は良くならないはず。