Twilio
Twilio Video audio fails when the page isn't HTTPS, mic is denied, or autoplay blocks audio. One-way SIP/PSTN audio indicates NAT blocking UDP media ports.
Updated Jul 1, 2026
The short answer
"Twilio Video audio not working" is a symptom, not an error code. In browser WebRTC apps it usually means the page is not on HTTPS, mic permission was denied, the mic is held by another app, or autoplay blocked remote audio; the Video SDK surfaces these via getUserMedia errors and Preflight, not numeric codes. On PSTN or SIP calls it is typically one-way audio from NAT or firewall blocking UDP media ports 10000-60000. Fix it by checking NAT and SIP ALG first.
"Twilio Video audio not working" is not a documented Twilio error code or SMTP-style reply — it's a catch-all symptom that maps to several distinct, diagnosable root causes depending on whether you're using a browser WebRTC SDK (Twilio Video JS, or the Voice JS SDK) or a PSTN/SIP voice call. Identify which path you're on first, then apply the matching fix below.
The most common root causes, by environment:
Browser WebRTC (Twilio Video JS / Voice JS SDK):
getUserMedia() only works on localhost or an HTTPS origin. Over plain HTTP, navigator.mediaDevices is undefined and no mic track is ever acquired.getUserMedia() call rejects with a DOMException whose name is NotAllowedError, and createLocalAudioTrack() fails.deviceId or over-restrictive constraints. In the Voice JavaScript SDK this is error 31402 (UserMedia Acquisition Failed). In the Video JavaScript SDK the same condition appears as a getUserMedia() rejection (NotReadableError, OverconstrainedError, etc.) rather than a 314xx code.getUserMedia() can succeed yet produce a silent track because another tab or app holds the device. The participant joins but no one can hear them.<audio>/<video> from autoplaying without a user gesture, so remote participants' audio never plays back even though it's arriving.PSTN / SIP voice calls (one-way audio): signaling completes and the call connects, but audio is missing in one direction. This is almost always a NAT/firewall issue: the SDP advertises a private/unreachable media address, or a firewall/SIP ALG blocks the RTP path.
https:// or localhost. If navigator.mediaDevices is undefined, this is your cause.navigator.mediaDevices.getUserMedia({ audio: true }) before creating the Device/Room to surface permission/acquisition failures sooner, and gate on the SDK's isSupported flag.// Probe permission and supported browser before connectingif (!Twilio.Video.isSupported) { /* show unsupported-browser message */ }try {const stream = await navigator.mediaDevices.getUserMedia({ audio: true });stream.getTracks().forEach(t => t.stop()); // release until you actually join} catch (e) {// e.name === 'NotAllowedError' -> guide user to re-enable mic permission}
LocalAudioTrack, feed it through a Web Audio AnalyserNode, and measure the RMS level. If it stays at 0 while the user speaks, the device is reserved — instruct them to close other apps/tabs and restart the browser.rtcConstraints, test with plain audio: true, validate the deviceId against device.audio.availableInputDevices, and call device.audio.unsetAudioConstraints() if you set custom audio settings.168.86.128.0/18) and let your hosts initiate the connection outbound (SRTP/DTLS). Signaling is TCP 443.iceServers so media can relay over TCP/TLS.With Courier
References
FAQ
No. It's a symptom description, not a documented Twilio or RFC error code. The closest official codes are 31401 (UserMedia Permission Denied) and 31402 (UserMedia Acquisition Failed) for browser mic access, plus one-way-audio guidance for SIP/PSTN calls.
One API, every provider
Courier connects to your email, SMS, and push providers, handles retries and failover, and surfaces delivery errors in plain language.
Last reviewed Jul 1, 2026. Courier is not affiliated with third-party providers; error behavior may vary by implementation.
© 2026 Courier. All rights reserved.