Signatur
Beschreibung
Die Eigenschaft canInsertDTMF des Interfaces RTCDTMFSender gibt true zurück, wenn der zugehörige Sender DTMF-Töne (Tastentöne wie bei der Telefonwahl, z. B. für Sprachmenüs oder IVR-Systeme) in den Audiostrom einfügen kann. Ist das nicht möglich, liefert sie false.
Ob DTMF möglich ist, hängt von mehreren Bedingungen ab:
- Der zugehörige
RTCRtpTransceivermuss eine Senderichtung haben (currentDirectionist"sendrecv"oder"sendonly"). - Die Verbindung muss ausgehandelt sein, und die Gegenstelle muss den Payload-Typ
telephone-event(RFC 4733) in ihrer SDP unterstützen. - Der Transceiver darf nicht gestoppt sein.
Prüfe canInsertDTMF vor dem Aufruf von insertDTMF(). Ist der Wert false, wirft insertDTMF() eine InvalidStateError-DOMException. Den RTCDTMFSender bekommst du über RTCRtpSender.dtmf eines Audio-Senders.
Rückgabewert
true, wenn gerade DTMF-Töne gesendet werden können, sonst false.Beispiele
Vor dem Senden prüfen, ob DTMF möglich ist
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const pc = new RTCPeerConnection();
const [track] = stream.getAudioTracks();
const sender = pc.addTrack(track, stream);
// ... Angebot/Antwort aushandeln (Signalisierung) ...
const dtmf = sender.dtmf;
if (dtmf?.canInsertDTMF) {
dtmf.insertDTMF('1234#', 100, 70);
console.log('DTMF gesendet');
} else {
console.log('DTMF wird derzeit nicht unterstützt');
}
Wähltastatur erst nach erfolgreicher Aushandlung freischalten
const keypad = document.querySelector('#keypad');
keypad.disabled = true;
const updateKeypad = (sender) => {
keypad.disabled = !(sender.dtmf && sender.dtmf.canInsertDTMF);
};
pc.addEventListener('connectionstatechange', () => {
if (pc.connectionState === 'connected') {
const audioSender = pc.getSenders().find((s) => s.track?.kind === 'audio');
if (audioSender) updateKeypad(audioSender);
}
});
Sichere Hilfsfunktion mit Fehlerbehandlung
const sendTones = (sender, tones) => {
const dtmf = sender?.dtmf;
if (!dtmf) {
console.warn('Kein DTMF-Sender (kein Audio-Track?)');
return false;
}
if (!dtmf.canInsertDTMF) {
console.warn('DTMF momentan nicht möglich');
return false;
}
try {
dtmf.insertDTMF(tones);
return true;
} catch (err) {
console.error(err.name, err.message);
return false;
}
};
sendTones(pc.getSenders()[0], '*9');
// Wichtig · Fallstricke
- Zeitpunkt: Vor Abschluss der SDP-Aushandlung (z. B. direkt nach
addTrack()) ist der Wert meistfalse. Prüfe ihn erst, wenn die Verbindung steht. - Nur Audio:
RTCRtpSender.dtmfist bei Video-Sendernnull. Greifst du ohne Prüfung aufcanInsertDTMFzu, gibt es einenTypeError. Optionale Verkettung (?.) verwenden. - Der Wert kann sich während der Sitzung ändern, etwa bei einer Neuaushandlung oder wenn der Transceiver gestoppt oder seine Richtung auf
"recvonly"gesetzt wird. - Kompatibilität: Chrome und Edge unterstützen die Eigenschaft erst seit Version 108. Ältere Browser kennen
RTCDTMFSenderzwar, aber nichtcanInsertDTMF. Dort ist der Wertundefined, und ein Aufruf voninsertDTMF()intry/catchist die Ausweichlösung. - DTMF funktioniert nur, wenn die Gegenstelle
telephone-eventaushandelt. Viele reine Browser-zu-Browser-Szenarien brauchen DTMF gar nicht. Wichtig ist es vor allem bei SIP- und Telefonie-Gateways.