鸟语天空
WebRTC DTMF
post by:追风剑情 2024-2-5 11:26

  DTMF (Dual-tone Multi-frequency,双音多频) 是一种实现快速可靠传输电话号码的技术,它具有很强的抗干扰能力和较高的传输速度。

  举例说明一个 DTMF 的应用场景: 用户拨打了10086,会有相应的语音提示信息,比如 “普通话请按1。For English service,press 2.” 那么 10086 如何知道用户按了哪个键?这时需要一种技术将用户按的号码通知给后台,这就是 DTMF 的用途。

  DTMF 用两个特定的单音频组合信号代表数字信号,两个单音频组合信号的频率不同,代表的数字或实现的功能也不同。普通拨号电话通常有16个按键,包括10个数字键0~9和6个功能键*、#、A、B、C、D。按照组合原理,一般应有8种不同的单音频信号,因此可采用的频率也有8种,故称之为多频。

  WebRTC支持DTMF的主要目的是兼容PSTN及VOIP电话网,目前只支持发送DTMF拨号数据,但不支持接收,所以还不能用于WebRTC应用程序的两端。

  WebRTC 通过 RTCRtpSender.dtmf 属性获取RTCDTMFSender 对象,使用该对象发送DTMF,RTCDTMFSender的定义如下面的代码清单所示。

//RTCDTMFSender的定义
interface RTCDTMFSender : EventTarget {
	void insertDTMF(DOMString tones, optional unsigned long duration = 100, optional unsigned long interToneGap =70);
	attribute EventHandler ontonechange;
	readonly attribute boolean canInsertDTMF;
	readonly attribute DOMString toneBuffer;
};

RTCDTMFSender 属性

1.canInsertDTMF

该属性表示返回当前通道是否支持发送DTMF拨号数据,true表示支持,false表示不支持。不支持的原因是未建立连接或收发器,RTCRtpTransceiver.currentDirection 没有包含send。

如下面的代码清单所示,判断是否支持发送DTMF拨号数据,如果支持则调用方法 insertDTMF 进行发送。

//canInsertDTMF示例
if (sender.dtmf.canInsertDTMF) {
	const duration =500;
	sender.dtmf.insertDTMF('1234', duration);
} else {
	console.log("DTMF function not available");
}

2.toneBuffer

该属性表示返回当前待发送的 DTMF 拨号数据,这些数据由 insertDTMF()方法写入,成功发送出去的 DTMF 将从缓存中删除。

RTCDTMFSender 方法

insertDTMF() 方法

调用该方法将DTMF拨号数据追加到toneBuffer,并开始异步发送,如果成功发送则触发 tonechange 事件。

RTCDTMFSender.insertDTMF(tones[, duration[, interToneGap]]);

参数:tones,包含DTMF拨号数据的字符串,如果tones为空字符串,则清空toneBuffer;duration,DTMF拨号数据持续时长,单位为毫秒,取值范围40~6000ms,默认值100ms;interToneGap,DTMF拨号之间的等待时长,单位为毫 秒,最小值为 30ms,默认值 70ms。
返回值:无。
异常:InvalidStateError,状态错误导致不能发送 DTMF 拨号数据;InvalidCharacterError,DTMF 包含了无效的拨号数据。

如下面的代码清单所示,当 RTCPeerConnection 建立连接成功时,调用 insertDTMF() 方法发送拨号数据 dialString。

//insertDTMF()方法示例
function handleCallerIceConnectionstateChange() {
	log("Caller's connection state changed to " + pc.iceConnectionState) ;
	if (pc.iceConnectionState === "connected") {
		log("Sending DTMF:"+ dialstring);
		dtmfSender.insertDTMF(dialString, 400, 50);
	}
}

RTCDTMFSender 事件

tonechange 事件

每成功发送一条DTMF拨号数据,即触发异常tonechange事件,对应事件柄ontonechange。通过事件的属性tone可以判断具体的拨号数据,如果tone是空字符串,则表示所有拨号数据都已经发送完了。

下面的代码清单演示了 ontonechange 事件句柄的用法,如果 event.tone 不为空,则打印拨号数据,如果为空,则断开连接。

//ontonechange事件句柄示例
dtmfSender.ontonechange = (event) => {
	if (event.tone !== "") {
		log("Tone played: " + event.tone);
	} else {
		log("All tones have played. Disconnection.");
	}
};

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容