「Asterisk AudioSocket」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「Asterisk 18~で実装されたTCPベースの『簡単な』オーディオ・ストリーム入出力。<br> <br> アプリケーション(app_audiosocket)とチャネルドライバ(chan_audiosocket)があるので注意。CODEC指定が可能なのはチャネルドライバのみ。<br> ==データフォーマット== 0 1 2 3..... PT LEN LEN Payload PT-ペイロードタイプ<br> LEN-ペイロード長(2byte)<br> Payload-ペイロード本体<…」 |
|||
| (同じ利用者による、間の3版が非表示) | |||
| 26行目: | 26行目: | ||
0x18 - ペイロードは符号付リニア, 16-bit, 192kHz, モノラルPCM | 0x18 - ペイロードは符号付リニア, 16-bit, 192kHz, モノラルPCM | ||
0xff – エラー:ペイロードはエラーコードを含む | 0xff – エラー:ペイロードはエラーコードを含む | ||
<br> | |||
注意:LEN(ペイロード長)は2byteだが、NBOなのでビッグ・エンディアン。ペイロードに乗る音声データはリトル・エンディアン。 | |||
==app_audiosocket== | ==app_audiosocket== | ||
サンプル | サンプル | ||
| 36行目: | 39行目: | ||
app_audiosocketはオートアンサしないので明示Answer()する必要がある。<br> | app_audiosocketはオートアンサしないので明示Answer()する必要がある。<br> | ||
==chan_audiosocket== | ==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で送り出しているので、音がおかしなことになる。)<br> | |||
<br> | |||
サンプル<br> | |||
exten => 7000,1,NoOp | exten => 7000,1,NoOp | ||
exten => 7000,n,Set(MYUUID=${UUID()}) | exten => 7000,n,Set(MYUUID=${UUID()}) | ||
exten => 7000,n,Dial(Audiosocket/127.0.0.1:9093/${MYUUID}/c(slin48)) | exten => 7000,n,Dial(Audiosocket/127.0.0.1:9093/${MYUUID}/c(slin48)) | ||
exten => 7000,n,Hangup | exten => 7000,n,Hangup | ||
==テストコード== | ==テストコード== | ||
Audiosocketで受信し、単純エコーバックするだけのコード。<br> | Audiosocketで受信し、単純エコーバックするだけのコード。<br> | ||
2026年9月25日 (金) 12:07時点における最新版
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等もできるが、当然、音質は良くならないはず。