The Amazon Chime SDK is a set of real-time communications components that developers can use to quickly add audio calling, video calling, messaging, and screen sharing capabilities to their own web or mobile applications. Developers can build on AWS's global communications infrastructure to deliver engaging experiences in their applications.
There are three client SDKs that can be used by applications based on operating system or use case. Each of these repos have walkthroughs, and links to demos and sample code:
Amazon Chime uses utility-based pricing. Meetings are billed based on attendee minutes (from the time an attendee joins and then leaves a meeting), in 0.1 minute increments.
Example 1: A 10 minute meeting with 2 people attending for the whole meeting costs 20 attendee minutes.
Example 2: A 10 minute meeting, with 2 people attending for the whole time, and 1 person joining for the last 5 minutes, costs 25 attendee minutes.
Billing starts when the attendee joins the meeting and leaves the meeting. Calling CreateAttendee or BatchCreateAttendee does not initiate billing, rather it just creates the join token to enable an attendee to join.
The meetings created by the Amazon Chime meetings application and the SDK are distinct. The Amazon Chime SDK is meant for customers who would like to build the experience into their existing applications and it is not a means to create an Amazon Chime meeting (with a PIN) that can be joined using the Amazon Chime meetings application. You cannot use the Amazon Chime SDK to build a custom client to join an Amazon Chime meeting with a PIN.
Yes, we currently support SNS topics or SQS queues located in us-east-1 region only. For more details, please refer
to Meeting Notification Configuration API.
You can find the complete list of browsers in this link: Supported Browsers. WebRTC support in a browser is a prerequisite for the Amazon Chime SDK for JavaScript to run. Browsers that do not offer WebRTC support, like Internet Explorer, are not supported.
The SDK is built to target ES2015, both syntax and features. If you need your built application bundle to target legacy browsers that do not support ES2015 syntax, including Internet Explorer, you will need to transpile the SDK code using a transpiler like Babel, split your application bundle into multiple files that can be built with different targets and conditionally loaded, or generate multiple versions of your application to target specific browsers.
Note that due to limitations in transpilers, requirements of the web platform might result in transpiled ES5 code that raises an error when run, such as "Please use the 'new' operator, this DOM object constructor cannot be called as a function". Prefer using ES2015 code on supported platforms.
The Amazon Chime SDK for JavaScript is supported on certain mobile browsers listed in the official Amazon Chime SDK documentation: https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html#mtg-browsers. Developers can also build native mobile applications using the following SDKs (this option allows for meetings to continue when applications are sent to the background).
Safari on macOS has a known Web Audio issue that a MediaStreamAudioDestinationNode stops working when you minimize the window. The bug also occurs when you activate the full-screen mode and switch to another window. To remediate the issue, disable Web Audio by passing the { enableWebAudio: false } argument, or no argument, to new DefaultDeviceController.
Firefox and Safari have known issues disallowing them from listing audio output devices on these browsers. While clients can continue the meeting using the default device, they will not be able to select devices in meetings. Chrome and Firefox on iOS also have the same issue.
Android Chrome has a known issue switching between Bluetooth audio output devices. While clients can continue the meeting using the default device, there is a bug related to switching to a Bluetooth audio output.
In the background, bindAudioElement(), bindAudioStream(), and bindAudioDevice() call the browser API setSinkId(). The full list of browsers that support setSinkId API can be found here. In Firefox, this feature is behind the media.setsinkid.enabled preference (needs to be set to true). To change preferences in Firefox, visit about:config.
Use BrowserBehavior.supportsSetSinkId() to determine whether the browser supports setSinkId() before calling these methods.
macOS and iOS Safari browsers have limitations when you use a camera in more than one apps or tab.
For example, if you enable a video in two macOS Safari tabs, one video will go black.
Make sure to close all other apps and tabs that are using the camera.
In Firefox, if access to camera or microphone has been granted to the site — either by currently having a video or audio input, or as a result of the user choosing to always allow access — and the profile has not been configured with media.peerconnection.ice.default_address_only, then ICE will gather all interface addresses. If the user has not granted the appropriate permissions, or if that preference has been set, then the ICE stack will limit ICE candidates to a default interface only. The default interface is the one that was used to load the page. This is a privacy mechanism in Firefox to stop sites from de-anonymizing VPN users via WebRTC leakage.
If the page itself is loaded via a different network interface than the one that is intended to be used by the Amazon Chime SDK to connect to Amazon Chime media resources, e.g., in a split-tunneling VPN where browser traffic uses the VPN interface but Amazon Chime video and audio does not, then ICE gathering will use the wrong interface, which can result in sub-optimal network routing or an inability to use audio or video functionality.
Customers and end users must ensure that either (a) end users do not use SDK applications in these kinds of split-tunneling scenarios, or (b) the SDK application always requests microphone permissions prior to beginning ICE.
Amazon Chime SDK for JavaScript 3.7.0 included a bug fix to mitigate messaging session reconnection issue. Check MessagingSession reconnects with refreshed endpoint and credentials if needed for more information on the fix. We added @aws-sdk/client-chime-sdk-messaging dependency necessary to mitigate the fix. @aws-sdk/client-chime-sdk-messaging pulls in aws-sdk v3 dependency and its dependencies cause the build to fail in all cases.
Depending on the bundler you use, certain additional configuration changes may be required to help the build to succeed. This is actually not an issue with Amazon Chime SDK for JavaScript rather an issue on how bundlers do module resolution and what distributions @aws-sdk/client-chime-sdk-messaging's dependencies provide when bundlers try to resolve the imported modules.
As of now, builders have reported issues with rollup, esbuild, Nuxt2 framework and Webpack v4. In the following sections each issue is described separately and suggests certain configuration changes for the build to succeed.
When a builder makes use of the rollup plugin: rollup-plugin-includepaths they may run into build issues where node modules and their methods are not found. For example, in the following warnings / errors the Node.js built-ins and the createHash method from crypto is not found.
This node / browser incompatibility issue happens due to bundlers not using the right runtimeConfig defined in AWS JS SDK client's package.json. Clients in AWS JS SDK have defined a runtime config alias in their package.json like this: Chime SDK Messaging client package.json. If your bundler does not follow the runtimeConfig alias, you can get some incompatibility errors.
If the builder is using rollup-plugin-includepaths to use relative paths in their project. It is recommended that you use rollup-plugin-alias to define an alias for relative paths.
You can find more information about this build error in GitHub issue: 3.7.0 broke build with Rollup. If you still have questions about rollup alias and plugin settings please reach out to the plugin / rollup author.
When bundling an application using esbuild, it checks for dependency distributions depending on whether the imported package follows require that is CommonJS or import that is EcmaScript Module (ESM) approach. The dependency package can have its own dependencies which esbuild will try to resolve using the CommonJS or ESM distributions provided by the dependency package. Each package has to provide a link to the distribution path in their package.json using main, module or browser fields. In @aws-sdk/client-chime-sdk-messaging case, the esbuild runs into an issue where it cannot pick the distribution for browser specifially for one of the dependencies, thus, failing to build with below error:
To resolve this, add --main-fields=browser,module,main when you bundle your application using esbuild. For more information, check this issue we reported to esbuild.
You can use Amazon Chime SDK for JavaScript in Nuxt2 framework. Nuxt2 framework uses Webpack v4 bundler for bundling the application. Webpack v4 has a known issue when bundling applications that use optional chaining operator. This is resolved in Webpack v5, but, Nuxt2 has not upgraded to use Webpack v5.
Thus, when bundling a Nuxt2 application which imports Amazon Chime SDK for JavaScript v3.7.0 and above, it runs into below error:
The Amazon Chime SDK uses join tokens to control access to meetings. These tokens are obtained when each attendee is created. The safe distribution of these tokens to the clients is the application developer’s responsibility. The Amazon Chime SDK does not authenticate end users. Developers can use services such as Amazon Cognito, Open ID connect, Active Directory, or Facebook to log in end users to their application. You can tie external identity management to Amazon Chime SDK attendees by supplying an externalUserId when creating the attendee.
AWS accounts have a soft limit of 250 concurrent meetings. Your limit can be obtained from the Service quotas console in your AWS account. The limit is applied globally, based on the total number of active meetings across all regions. You can track your concurrent meeting usage in Amazon CloudWatch. If your application needs to support more concurrent meetings, you can request limit increases through the AWS Customer support portal.
Amazon Chime SDK limits are defined here. The service supports up to 250 attendees and by default up to 25 video senders in a meeting. An attendee is considered active unless it has been explicitly removed using DeleteAttendee. Attendee limits cannot be changed. The number of video senders can be adjusted, but all clients will still be limited to only 25 received videos at a time.
Once the limit of video senders is reached in a meeting, each subsequent participant that tries to turn on the local video will receive a Meeting Session status code of VideoCallSwitchToViewOnly = 10 which in turn triggers the observer 'videoSendDidBecomeUnavailable'.
The Amazon Chime SDK does not support scheduling meetings ahead of time. The moment CreateMeeting or
CreateMeetingWithAttendees is invoked and the meeting is created, the auto end
policies will apply. If no attendees join the meeting, it will end after 5 minutes. The application can create the meeting when drawing closer to the meeting start time or when the the first attendee is ready to join.
If two clients attempt to join the same meeting using the same AttendeeId or ExternalUserId response received from CreateAttendee API then the first attendee will automatically leave the meeting with AudioJoinFromAnotherDevice meeting session status code. The AudioJoinFromAnotherDevice meeting session status code is triggered by the Amazon Chime backend.
The SignalingBadRequest status code indicates that the Chime SDK for JavaScript has failed to establish a signaling connection to the Chime servers. The INFO-level browser logs may include the following messages:
If you attempt to join a meeting using a deleted attendee's response, the Amazon Chime SDK for JavaScript throws an error with the status code SignalingBadRequest. Note that you or someone can delete an attendee in the DeleteAttendee API action.
The close code 4410 from the Chime backend indicates that an attendee has attempted to join an already-ended meeting. The Amazon Chime SDK for JavaScript throws an error with the status code MeetingEnded.
The close code between 4500 and 4599 (inclusive) indicates an internal server error in the Amazon Chime backend. In this case, the Amazon Chime SDK for JavaScript throws an error with the status code SignalingInternalServerError. Please create a GitHub issue including the Amazon Chime SDK browser logs.
The Amazon Chime SDK for JavaScript retries the connection in the following situations.
The SDK misses consecutive pong messages from the Chime server.
The SDK detects a high rate of audio packet loss.
The SDK experiences a significant audio delay.
The SDK encounters a retryable error during the session. Retryable errors are errors with retryable response status codes received regarding the session. i.e. status code with TaskFailed or SignalingInternalServerError will handled for retries.
The SDK uses ConnectionHealthPolicyConfiguration to trigger a reconnection. We recommend using the default configuration, but you can also provide the custom ConnectionHealthPolicyConfiguration object to change this behavior.
import {ConnectionHealthPolicyConfiguration,ConsoleLogger,DefaultDeviceController,DefaultMeetingSession,LogLevel,MeetingSessionConfiguration} from'amazon-chime-sdk-js';constlogger = newConsoleLogger('MyLogger', LogLevel.INFO);constdeviceController = newDefaultDeviceController(logger);consthealthPolicyConfiguration = newConnectionHealthPolicyConfiguration();// Default: 25 consecutive WebRTC stats with no packet. You can reduce this value for a faster retry.healthPolicyConfiguration.connectionUnhealthyThreshold = 50;// Default: 10000 mshealthPolicyConfiguration.connectionWaitTimeMs = 20000;// Default: 60000 ms delayhealthPolicyConfiguration.maximumAudioDelayMs = 30000; // Default: 10 data pointshealthPolicyConfiguration.maximumAudioDelayDataPoints = 5;// Default: 4 missed pongs. You can set the missed pongs upper threshold to zero to force restart the session.healthPolicyConfiguration.missedPongsUpperThreshold = 4; constconfiguration = newMeetingSessionConfiguration(meetingResponse, attendeeResponse);// Override the default health policy configuration.configuration.connectionHealthPolicyConfiguration = healthPolicyConfiguration;constmeetingSession = newDefaultMeetingSession(configuration,logger,deviceController);
These status codes can be used for logging, debugging, and possible notification of end users, but in most cases should not be used for any retry behavior, as the audio video controller will already be retrying non-terminal errors (i.e. regardless of MeetingSessionStatus.isTerminal, your application should not try to immediately restart or recreate the audio video controller).
If MeetingSessionStatus.isTerminal returns true, you should remove any meeting UX in addition to notifying the user, as the audio video controller will not be retrying the connection.
See the documentation for MeetingSessionStatusCodehere for explanation of the values when used for audioVideoDidStop, which may be used to provide more detail when notifying end users, though more general failure messages are recommended unless otherwise noted.
The maximum amount of time to allow for connecting is 15 seconds, which can be configurable in MeetingSessionConfiguration. The reconnectTimeout is configurable for how long you want to timeout the reconnection. The default value is 2 minutes.
You can find the full list of media regions that the Amazon Chime SDK supports here, along with how you can determine the best region for a client. Each client application can query for the best region and return it back to the server application, which can use the collected nearest-region information from each client to select a region for the meeting. This region can then be passed as the MediaRegion
parameter to CreateMeeting or
CreateMeetingWithAttendees.
You can use the [AudioVideoFacade.startContentShare(MediaStream)](https://aws.github.
io/amazon-chime-sdk-js/interfaces/audiovideofacade.html#startcontentshare) API to stream audio and/or video content
to the meetings. See the meeting demo application for an example of how to
achieve this.
The AudioVideoFacade.startContentShare(MediaStream) API uses the HTMLMediaElement.captureStream API to stream video content content to the meeting. Chrome 88 and above have a known issue that the captureStream API does not send any data.
As a workaround, you can turn hardware acceleration off in Chrome (version 88.0.4324.146 and above) and then stream video. Go to Settings (chrome://settings), scroll down to System, and turn off "Use hardware acceleration when available".
You can deploy a web application broadcasting solution similar to the Amazon Chime Meeting Broadcasting Demo to broadcast an Amazon Chime SDK meeting to RTMP-enabled streaming services by instead using a MEETING_URL consisting of the URL to the meeting to be broadcasted.
Remote mute is the ability of one attendee in a meeting to mute another attendee. This feature is currently not supported server-side by the SDK. However, you can use Amazon Chime SDK Data Messages to send a message containing the attendee or attendees that should mute, and clients can mute themselves when they receive those messages.
The getObservableVideoMetrics API exposes video quality statistics. The getObservableVideoMetrics API returns following metrics:
// Upstream metrics of local attendeevideoUpstreamBitrate,videoUpstreamPacketsSent,videoUpstreamPacketLossPercent,videoUpstreamFramesEncodedPerSecond,videoUpstreamFrameHeight,videoUpstreamFrameWidth,// Downstream metrics of remote attendeesvideoDownstreamBitrate,videoDownstreamPacketLossPercent,videoDownstreamPacketsReceived,videoDownstreamFramesDecodedPerSecond,videoDownstreamFrameHeight,videoDownstreamFrameWidth,
Your account will get billed for attendee minutes and for any other AWS resources used by the demo. Please use AWS Cost Explorer for details on cost breakdown.
Applications can get logs from Chime SDK by passing instances of Logger when instantiating the MeetingSession object. Amazon Chime SDK has some default implementations of logger that your application can use, such as ConsoleLogger which logs into the browser console, POSTLogger which logs in Amazon CloudWatch and MultiLogger which logs in multiple destinations.
You can use our bug template to file issues with logs (it is helpful to set the logging
level as INFO) and exact reproduction steps. To help you faster, you can check the usage of the API in our API overview, demos and the usage section in our Readme. In addition search our issues database as your concern may have been addressed previously and mitigations may have been posted.
A client running the Amazon Chime SDK connects to the Amazon Chime service via URIs (never direct IP addresses) that are part of the *.chime.aws domain. The URIs resolve to IP addresses in the CHIME_MEETINGS subnets, as published in the AWS ip-ranges.json, which is currently a single subnet: 99.77.128.0/18.
The Amazon Chime SDK will use TCP:443 for https and websocket connectivity, and UDP:3478 for media. If UDP:3478 is blocked, the SDK falls back to TCP. However the video experience will be poor, and audio will use a region specific subnet assigned by Amazon Elastic Compute Cloud (Amazon EC2).
Some features such as Amazon Voice Focus require accessing Amazon CloudFront.
The Amazon Chime SDK has URL rewriter hooks that the application builder can use to munge the URLs to traverse unauthenticated proxies. When traversing a proxy, all media is sent over TCP which impacts the user experience.
Amazon Chime SDK for JavaScript applications do not support content sharing on mobile browsers because a key dependency, WebRTC's getDisplayMedia is not available on these browsers. Clients joining from these devices can still view content shared by other participants in the call.
iOS Safari/Chrome/Firefox have a known issue where the device selection list only lists one audio input device even when there are multiple. For example
, if you plug in a wired headset to your iPhone, it will show up as iPhone microphone replacing the internal mic. For
more information, please refer to the Webkit issue.
This was a known issue on iPhone X devices (X, XS, and XR) when using AudioContext-based APIs in iOS Safari 13 and below. Please upgrade your device to iOS 14 and try again. For more information, see our comment in the WebKit issue.
iOS Safari/Chrome/Firefox browsers have a known issue where they do not automatically switch to the iOS internal speaker after users unplug
their wired headset. For more information, please refer to the Webkit issue.
This is the default behavior that is specific to each browser. In Android, the video stream is muted when in background and thus, the video will show the last frame.
Note that for Android, if an attendee joins later after the video stream is in background, it will show as a blank tile since the last frame is blank.
For better user experience, we recommend considering Chime SDK iOS and
Chime SDK Android.
This seems to be a bug with Android 8 or 9 when using getUserMedia with speakerphone device Id that the audio stream will end after a brief moment. Using default device Id will fix this issue. Note that this only happens if users select speakerphone first. If you use default device when joining the meeting then switch to Speakerphone, this issue does not happen.
This error indicates that the device you are using does not support hardware acceleration decoding. However this does not impact the ability of this user to participate in Amazon Chime SDK meetings as the device can render and transmit VP8 streams to other parties in the call. Specifically for Chrome, you will need to enable Simulcast.
In some cases, H.264 may be missing from the initial SDP offer tracking Chromium bug) causing this slate to appear. Rejoining the meeting can fix the videos to be rendered once again.
This is a bug on Android 11 running Chromium 83 based browsers. You will observe this issue on the Samsung Internet browser (Version 13) since it is based on Chromium 83. Please check ICE gathering stalls in Chrome on Android 11 bug for more information. This issue is not observed on the Samsung Internet browser (Version 12) or the latest Chrome for Android browser when tested on an Android 11 device.
Yes, Amazon Voice Focus supports the Samsung Internet browser (Chromium 83 or lower). However, it leads to a poor user experience because the preferred Chromium version is 87 or higher. Please check Amazon Voice Focus browser compatibility matrix in Amazon Voice Focus guide.
Amazon Chime SDK for JavaScript uses WebRTC’s getUserMedia() when you invoke the startAudioInput or
startVideoInput APIs which can operate in secure contexts inside a browser only for privacy concerns so you will need to access your browsers using HTTPS://. The hostname localhost and the loopback address 127.0.0.1 are exceptions.
Applications that show multiple video tiles on the screen will need to decide where to place the underlying video elements and how to apply CSS styling. Here are a few things to consider as you develop the tile layout for your application:
A video whose source is a mobile device in portrait mode will display quite differently compared to a video in landscape mode from a laptop camera. The CSS object-fit rule can be applied to the video element to change how the content scales to fit the parent video element.
For landscape aspect ratios (width > height), apply the CSS rule object-fit:cover to the HTML element that will contain the video to crop and scale the video to the aspect ratio of the video element.
For portrait aspect ratios (height > width), apply the CSS rule object-fit:contain to the HTML element that will contain the video to ensure that all video content can be seen.
When the camera LED remains on, it does not necessarily mean the device is broadcasting to the remote attendees. The LED will remain on until all media streams that use the device are released (its tracks are stopped). The following API methods release media streams.
// Select no video device (releases any previously selected device)meetingSession.audioVideo.stopVideoInput();
This error message is an indication that the browser application did not successfully acquire the media stream for
audio or video from the device before the meeting starts. Application has not passed in the right device Id to the
startVideoInput API. In this case you will see the following entry in the log where an empty string after
startVideoInput:
Device labels are privileged since they add to the fingerprinting surface area of the browser session. In Chrome private tabs and in all Firefox tabs, the labels can only be read once a MediaStream is active. How to deal with this restriction depends on the desired UX. The device controller includes an injectable device label trigger which allows you to perform custom behavior in case there are no labels, such as creating a temporary audio/video stream to unlock the device names, which is the default behavior.
You may want to override this behavior to provide a custom UX such as a prompt explaining why microphone and camera
access is being asked for by supplying your own function to setDeviceLabelTrigger(). See the meeting demo application for
an example.
meetingSession.audioVideo.setDeviceLabelTrigger(async (): Promise<MediaStream> => {// For example, let the user know that the browser is asking for microphone and camera permissions.showCustomUX();conststream = awaitnavigator.mediaDevices.getUserMedia({ audio:true, video:true });hideCustomUX();returnstream; });
The most significant improvement comes from choosing the right region to host your meeting, as discussed earlier in this FAQ.
Meeting join comprises several steps, one of which is establishing a signaling connection. You can front-load this work by specifying { signalingOnly: true } in a call to start as early as possible in your application — e.g., in a device picker or lobby view — and then calling start again to finish joining the meeting. The attendee will not be shown as having joined the meeting until the second start call completes.
Your application should not rely on MeetingSessionStatusCode for determining if the session stop is self-recoverable or terminal, instead, your should subscribe to AudioVideoObserver callbacks. When a self-recoverable session stop happens(i.e. caused by a poor network connection), AudioVideoObserver.audioSessionDidDrop() will be triggered, and Chime SDK will retry connecting automatically, if the session is successfully reconnected, AudioVideoObserver.audioSessionDidStart(reconnecting: true) will be triggered, your application should start handling the success of the reonnecting at this point; when a terminal session stop happens or retries have been exhausted, AudioVideoObserver.audioSessionDidStopWithStatus(MeetingSessionStatus) will be triggered, in this case any further retry will not be helpful, you application should handle the session stop accordingly based on the MeetingSessionStatusCode, and notify user if needed.
MeetingSessionStatusCode provides additional details for the MeetingSessionStatus received for a session. The primary use is in callbacks of AudioVideoObserver. Specifically, they are utilized in AudioVideoObserver.audioSessionDidStopWithStatus(MeetingSessionStatus)/AudioVideoObserver.videoSessionDidStartWithStatus(MeetingSessionStatus)/AudioVideoObserver.videoSessionDidStopWithStatus(MeetingSessionStatus) for iOS, and their equivalents for Android. There are also usages in ReplicatedMeetings, they have been documented separately(iOS/Android).
These status codes can be used for logging, debugging, and notification to end users, but in most cases should not be used for any retry behavior, as Chime SDK will already be retrying non-terminal errors. The table below illustrates how each code should be handled.
This code indicates the audio/video sessions on the device have been started/stopped without any errors. When received from AudioVideoObserver callbacks, your application may want to notify your user about the success of session start/stop.
It indicates the meeting session on the device has been disconnected due to the attendee leave, nothing to handle except notify your application user about the session stop.
networkBecomePoor(iOS) NetworkBecamePoor(Android)
connectionDidBecomePoor()
Your application not be receiving this code directly, AudioVideoObserver.connectionDidBecomePoor() will be triggered instead. You can subscribe to this callback and notify your application user about the network issue, however, you should not retry connect the meeting session, Chime SDK will handle it. When retries are exhausted, the meeting session will stop completely, audioSessionDidStopWithStatus(MeetingSessionStatus) will be triggered then.
There is an issue with Amazon Chime SDK service itself, the meeting session on the device has been terminated at this point, you will not be able to rejoin, your application should notify user about the session termination. Depends on your application design/user-flow, you could re-try/re-join the session, however, this may not work if the issue is not transient.
The attendee joined the meeting from another device. The meeting session on current device has been disconnected, your application should not retry connecting.
When received the code from the callback, the meeting session on the device has been terminated due to audio issues, the issue could be audio device related, or with Amazon Chime SDK service itself, you will not be able to rejoin the meeting, your application should notify user about the session termination.
When received this code from the callback, the meeting session on the device has been terminated because the attendee information is invalid, you will not be able to rejoin the meeting, your application should notify user about the session termination.
When received this code from the callback, the meeting session on the device has been terminated due to the meeting is at full capacity, the service supports up to 250 attendees. You will not be able to rejoin the meeting, your application should notify user about the session termination.
The meeting session has been ended on Amazon Chime SDK service side. When received this code from the callback, the meeting session on the device has been terminated, you will not be able to rejoin the meeting, your application should notify user about the session termination.
There was an internal server error related to video. This may indicate some issue with the camera device, or an issue with the Amazon Chime SDK service itself. When received thie code from the callback, you will not be able to join the video session, however, the audio session may still be working. Your application should notify user about the video session termination.
When received thie code from the callback, it indicates the video session on the device is in "receive only" mode due to capacity reached. Your local video source will not be sent to other attendess, however, you will still be able to receive video streams from other attendees.
When receveid this code from the callback, it indicates the meeting session on the device has been terminated due to audio input device related issues. You will not be able to rejoin the meeting, your application should notify user about the session termination.
When receveid this code from the callback, it indicates the meeting session on the device has been terminated due to audio output device related issues. You will not be able to rejoin the meeting, your application should notify user about the session termination.
When received this code from the callback, it indicates the meeting session has been terminated due to an status that the mobile SDK is not able to map. You will not be able to rejoin the meeting, your application should notify user about the session termination.
Below is the list of MeetingSessionStatusCode that you can reproduce for each AudioVideoObserver callback, please note some of the codes(i.e., audioServiceUnavailable) due to Amazon Chime SDK service issues, which cannot be reproduced on mobile Chime SDK client.
MeetingSessionStatusCode
audioSessionDidStopWithStaus()
videoSessionDidStartWithStatus()
videoSessionDidStopWithStatus()
connectionDidBecomePoor()
OK(iOS/Android)
During a valid call session, call meetingsession.audioVideo.stop().
With a valid meeting join info, call meetingSession.audioVideo.start().
During a valid call session, call meetingsession.audioVideo.stop().
N/A
Left(Android)
N/A
N/A
N/A
N/A
networkBecomePoor(iOS) NetworkBecamePoor(Android)
N/A
N/A
N/A
During a valid call session, disconnect the network on your iOS/Android device.
Start a Chime call session, have 250 attendee join the session, get another attendee to join the session, you will get this code. This does not apply to Amazon Connect use case.
Ttart a Chime call session, have 25 attendee join the session and start their videos, get another attendee to join the session, you will get this code. This does not apply to Amazon Connect use case.
This is due to audio input stream not starting properly, unable to reproduce this code, maybe try to physically disable your mic...
N/A
N/A
N/A
unknown(iOS)
This will be returned when there is an code that mobile SDK is not able to handle, currently if you disable the network connection on your device, wait for the reconnect exhausts
Frequently Asked Questions
Cannot select audio output device. This browser does not support setSinkId
error on the browser console. Is this a known issue?no ice candidates were gathered
error, is this a known issue?SignalingBadRequest
,MeetingEnded
, orSignalingInternalServerError
while establishing a signaling connection to the Chime servers?audioVideoDidStop
?navigator.mediaDevices is undefined
, what could be the reason?failed to get audio device for constraints null: Type error
, what could be the issue?MeetingSessionStatusCode
mean?MeetingSessionStatusCode
in my application?MeetingSessionStatusCode
?General questions
What is the Amazon Chime SDK?
The Amazon Chime SDK is a set of real-time communications components that developers can use to quickly add audio calling, video calling, messaging, and screen sharing capabilities to their own web or mobile applications. Developers can build on AWS's global communications infrastructure to deliver engaging experiences in their applications.
There are three client SDKs that can be used by applications based on operating system or use case. Each of these repos have walkthroughs, and links to demos and sample code:
Amazon Chime SDK for JavaScript https://github.com/aws/amazon-chime-sdk-js
Amazon Chime SDK for iOS https://github.com/aws/amazon-chime-sdk-ios
Amazon Chime SDK for Android https://github.com/aws/amazon-chime-sdk-android
How much does the Amazon Chime SDK cost?
Amazon Chime uses utility-based pricing. Meetings are billed based on attendee minutes (from the time an attendee joins and then leaves a meeting), in 0.1 minute increments.
Example 1: A 10 minute meeting with 2 people attending for the whole meeting costs 20 attendee minutes.
Example 2: A 10 minute meeting, with 2 people attending for the whole time, and 1 person joining for the last 5 minutes, costs 25 attendee minutes.
Billing starts when the attendee joins the meeting and leaves the meeting. Calling CreateAttendee or BatchCreateAttendee does not initiate billing, rather it just creates the join token to enable an attendee to join.
Additional information on pricing is available on the Amazon Chime pricing page. If you have more questions, contact Customer support.
I have a question not addressed in this FAQ. What is my next step?
If you have feature requests or feedback, please fill out the customer questionnaire for us to reach out to you.
Can I use the Amazon Chime application to join an Amazon Chime SDK meeting?
The meetings created by the Amazon Chime meetings application and the SDK are distinct. The Amazon Chime SDK is meant for customers who would like to build the experience into their existing applications and it is not a means to create an Amazon Chime meeting (with a PIN) that can be joined using the Amazon Chime meetings application. You cannot use the Amazon Chime SDK to build a custom client to join an Amazon Chime meeting with a PIN.
Does the MeetingsNotificationsConfiguration only support SQS queues in us-east-1?
Yes, we currently support SNS topics or SQS queues located in
us-east-1
region only. For more details, please refer to Meeting Notification Configuration API.How can I learn about interruptions to the Amazon Chime service?
You can be notified about Amazon Chime service interruptions at the https://status.aws.amazon.com/ website. In addition you can set up Amazon CloudWatch events via the AWS Personal Health Dashboard for the Amazon Chime service. You can find the Amazon Chime SLA on this webpage.
Browser support
What browsers are supported by the Amazon Chime SDK for JavaScript?
You can find the complete list of browsers in this link: Supported Browsers. WebRTC support in a browser is a prerequisite for the Amazon Chime SDK for JavaScript to run. Browsers that do not offer WebRTC support, like Internet Explorer, are not supported.
The SDK is built to target ES2015, both syntax and features. If you need your built application bundle to target legacy browsers that do not support ES2015 syntax, including Internet Explorer, you will need to transpile the SDK code using a transpiler like Babel, split your application bundle into multiple files that can be built with different targets and conditionally loaded, or generate multiple versions of your application to target specific browsers.
Note that due to limitations in transpilers, requirements of the web platform might result in transpiled ES5 code that raises an error when run, such as "Please use the 'new' operator, this DOM object constructor cannot be called as a function". Prefer using ES2015 code on supported platforms.
Is the Amazon Chime SDK supported on mobile browsers?
The Amazon Chime SDK for JavaScript is supported on certain mobile browsers listed in the official Amazon Chime SDK documentation: https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html#mtg-browsers. Developers can also build native mobile applications using the following SDKs (this option allows for meetings to continue when applications are sent to the background).
Amazon Chime SDK for iOS https://github.com/aws/amazon-chime-sdk-ios
Amazon Chime SDK for Android https://github.com/aws/amazon-chime-sdk-android
Known browser issues
Please refer to Known Browser and Compatibility Issues for more information.
In macOS Safari, audio stops playing when I minimize or move the window to the background. Is this a known issue?
Safari on macOS has a known Web Audio issue that a MediaStreamAudioDestinationNode stops working when you minimize the window. The bug also occurs when you activate the full-screen mode and switch to another window. To remediate the issue, disable Web Audio by passing the
{ enableWebAudio: false }
argument, or no argument, tonew DefaultDeviceController
.I am unable to select an audio output device in some browsers, is this a known issue?
Firefox and Safari have known issues disallowing them from listing audio output devices on these browsers. While clients can continue the meeting using the default device, they will not be able to select devices in meetings. Chrome and Firefox on iOS also have the same issue.
Android Chrome has a known issue switching between Bluetooth audio output devices. While clients can continue the meeting using the default device, there is a bug related to switching to a Bluetooth audio output.
I am getting
Cannot select audio output device. This browser does not support setSinkId
error on the browser console. Is this a known issue?In the background,
bindAudioElement()
,bindAudioStream()
, andbindAudioDevice()
call the browser APIsetSinkId()
. The full list of browsers that supportsetSinkId
API can be found here. In Firefox, this feature is behind themedia.setsinkid.enabled
preference (needs to be set totrue
). To change preferences in Firefox, visitabout:config
.Use
BrowserBehavior.supportsSetSinkId()
to determine whether the browser supportssetSinkId()
before calling these methods.My video disappears in Safari browsers, is this a known issue?
macOS and iOS Safari browsers have limitations when you use a camera in more than one apps or tab. For example, if you enable a video in two macOS Safari tabs, one video will go black. Make sure to close all other apps and tabs that are using the camera.
I cannot join meeting in Firefox with no audio and video permission due to
no ice candidates were gathered
error, is this a known issue?In Firefox, if access to camera or microphone has been granted to the site — either by currently having a video or audio input, or as a result of the user choosing to always allow access — and the profile has not been configured with
media.peerconnection.ice.default_address_only
, then ICE will gather all interface addresses. If the user has not granted the appropriate permissions, or if that preference has been set, then the ICE stack will limit ICE candidates to a default interface only. The default interface is the one that was used to load the page. This is a privacy mechanism in Firefox to stop sites from de-anonymizing VPN users via WebRTC leakage.If the page itself is loaded via a different network interface than the one that is intended to be used by the Amazon Chime SDK to connect to Amazon Chime media resources, e.g., in a split-tunneling VPN where browser traffic uses the VPN interface but Amazon Chime video and audio does not, then ICE gathering will use the wrong interface, which can result in sub-optimal network routing or an inability to use audio or video functionality.
Customers and end users must ensure that either (a) end users do not use SDK applications in these kinds of split-tunneling scenarios, or (b) the SDK application always requests microphone permissions prior to beginning ICE.
Known Build Issues
Why is my build failing after upgrading to Amazon Chime SDK for JavaScript 3.7.0?
Amazon Chime SDK for JavaScript 3.7.0 included a bug fix to mitigate messaging session reconnection issue. Check MessagingSession reconnects with refreshed endpoint and credentials if needed for more information on the fix. We added
@aws-sdk/client-chime-sdk-messaging
dependency necessary to mitigate the fix.@aws-sdk/client-chime-sdk-messaging
pulls inaws-sdk
v3 dependency and its dependencies cause the build to fail in all cases.Depending on the bundler you use, certain additional configuration changes may be required to help the build to succeed. This is actually not an issue with Amazon Chime SDK for JavaScript rather an issue on how bundlers do module resolution and what distributions
@aws-sdk/client-chime-sdk-messaging
's dependencies provide when bundlers try to resolve the imported modules.As of now, builders have reported issues with rollup, esbuild, Nuxt2 framework and Webpack v4. In the following sections each issue is described separately and suggests certain configuration changes for the build to succeed.
Rollup
When a builder makes use of the rollup plugin:
rollup-plugin-includepaths
they may run into build issues where node modules and their methods are not found. For example, in the following warnings / errors the Node.js built-ins and thecreateHash
method fromcrypto
is not found.This node / browser incompatibility issue happens due to bundlers not using the right
runtimeConfig
defined in AWS JS SDK client'spackage.json
. Clients in AWS JS SDK have defined a runtime config alias in theirpackage.json
like this: Chime SDK Messaging client package.json. If your bundler does not follow theruntimeConfig
alias, you can get some incompatibility errors.If the builder is using rollup-plugin-includepaths to use relative paths in their project. It is recommended that you use rollup-plugin-alias to define an alias for relative paths.
You can find more information about this build error in GitHub issue: 3.7.0 broke build with Rollup. If you still have questions about rollup alias and plugin settings please reach out to the plugin / rollup author.
Esbuild
When bundling an application using
esbuild
, it checks for dependency distributions depending on whether the imported package followsrequire
that is CommonJS orimport
that is EcmaScript Module (ESM) approach. The dependency package can have its own dependencies whichesbuild
will try to resolve using the CommonJS or ESM distributions provided by the dependency package. Each package has to provide a link to the distribution path in theirpackage.json
usingmain
,module
orbrowser
fields. In@aws-sdk/client-chime-sdk-messaging
case, theesbuild
runs into an issue where it cannot pick the distribution forbrowser
specifially for one of the dependencies, thus, failing to build with below error:To resolve this, add
--main-fields=browser,module,main
when you bundle your application usingesbuild
. For more information, check this issue we reported toesbuild
.Using Amazon Chime SDK for JavaScript in Nuxt2 framework
You can use Amazon Chime SDK for JavaScript in Nuxt2 framework. Nuxt2 framework uses Webpack v4 bundler for bundling the application. Webpack v4 has a known issue when bundling applications that use optional chaining operator. This is resolved in Webpack v5, but, Nuxt2 has not upgraded to use Webpack v5.
Thus, when bundling a Nuxt2 application which imports Amazon Chime SDK for JavaScript v3.7.0 and above, it runs into below error:
To resolve this, you have to override the
build
configuration innuxt.config.js
like below:Check this issue comment for more information on the issue.
Meetings
How do users authenticate into a meeting?
The Amazon Chime SDK uses join tokens to control access to meetings. These tokens are obtained when each attendee is created. The safe distribution of these tokens to the clients is the application developer’s responsibility. The Amazon Chime SDK does not authenticate end users. Developers can use services such as Amazon Cognito, Open ID connect, Active Directory, or Facebook to log in end users to their application. You can tie external identity management to Amazon Chime SDK attendees by supplying an
externalUserId
when creating the attendee.When does an Amazon Chime SDK meeting end?
An Amazon Chime SDK meeting ends when you invoke the DeleteMeeting API action.
Also, a meeting automatically ends after a period of inactivity, based on the following rules:
Learn more about Amazon Chime SDK namespace.
How many simultaneous meetings can be hosted in an account? Can this limit be raised?
AWS accounts have a soft limit of 250 concurrent meetings. Your limit can be obtained from the Service quotas console in your AWS account. The limit is applied globally, based on the total number of active meetings across all regions. You can track your concurrent meeting usage in Amazon CloudWatch. If your application needs to support more concurrent meetings, you can request limit increases through the AWS Customer support portal.
How many attendees can join an Amazon Chime SDK meeting? Can this limit be raised?
Amazon Chime SDK limits are defined here. The service supports up to 250 attendees and by default up to 25 video senders in a meeting. An attendee is considered active unless it has been explicitly removed using
DeleteAttendee
. Attendee limits cannot be changed. The number of video senders can be adjusted, but all clients will still be limited to only 25 received videos at a time.If your use case requires more than 250 attendees, consider using meeting replication to reach up to 10,000 participants, or a live connector media pipeline to output to RTMP.
What happens to the subsequent participants who try to turn on the local video when the maximum number of video senders is already reached?
Once the limit of video senders is reached in a meeting, each subsequent participant that tries to turn on the local video will receive a Meeting Session status code of VideoCallSwitchToViewOnly = 10 which in turn triggers the observer 'videoSendDidBecomeUnavailable'.
Can I schedule Amazon Chime SDK meetings ahead of time?
The Amazon Chime SDK does not support scheduling meetings ahead of time. The moment CreateMeeting or CreateMeetingWithAttendees is invoked and the meeting is created, the auto end policies will apply. If no attendees join the meeting, it will end after 5 minutes. The application can create the meeting when drawing closer to the meeting start time or when the the first attendee is ready to join.
What happens when I try to re-use same attendee response to join a meeting twice?
If two clients attempt to join the same meeting using the same
AttendeeId
orExternalUserId
response received from CreateAttendee API then the first attendee will automatically leave the meeting withAudioJoinFromAnotherDevice
meeting session status code. TheAudioJoinFromAnotherDevice
meeting session status code is triggered by the Amazon Chime backend.What does it mean when the Amazon Chime SDK for JavaScript throws an error with status code
SignalingBadRequest
,MeetingEnded
, orSignalingInternalServerError
while establishing a signaling connection to the Chime servers?The
SignalingBadRequest
status code indicates that the Chime SDK for JavaScript has failed to establish a signaling connection to the Chime servers. The INFO-level browser logs may include the following messages:The possible reasons are as follows:
SignalingBadRequest
. Note that you or someone can delete an attendee in the DeleteAttendee API action.4410
from the Chime backend indicates that an attendee has attempted to join an already-ended meeting. The Amazon Chime SDK for JavaScript throws an error with the status codeMeetingEnded
.4500
and4599
(inclusive) indicates an internal server error in the Amazon Chime backend. In this case, the Amazon Chime SDK for JavaScript throws an error with the status codeSignalingInternalServerError
. Please create a GitHub issue including the Amazon Chime SDK browser logs.When does the Amazon Chime SDK retry the connection? Can I customize this retry behavior?
The Amazon Chime SDK for JavaScript retries the connection in the following situations.
TaskFailed
orSignalingInternalServerError
will handled for retries.The SDK uses ConnectionHealthPolicyConfiguration to trigger a reconnection. We recommend using the default configuration, but you can also provide the custom ConnectionHealthPolicyConfiguration object to change this behavior.
What should my application do in response to the status codes in
audioVideoDidStop
?These status codes can be used for logging, debugging, and possible notification of end users, but in most cases should not be used for any retry behavior, as the audio video controller will already be retrying non-terminal errors (i.e. regardless of
MeetingSessionStatus.isTerminal
, your application should not try to immediately restart or recreate the audio video controller).If
MeetingSessionStatus.isTerminal
returnstrue
, you should remove any meeting UX in addition to notifying the user, as the audio video controller will not be retrying the connection.See the documentation for
MeetingSessionStatusCode
here for explanation of the values when used foraudioVideoDidStop
, which may be used to provide more detail when notifying end users, though more general failure messages are recommended unless otherwise noted.What is the timeout for connect and reconnect and where can I configure the value?
The maximum amount of time to allow for connecting is 15 seconds, which can be configurable in MeetingSessionConfiguration. The reconnectTimeout is configurable for how long you want to timeout the reconnection. The default value is 2 minutes.
Media
Which media regions is the Amazon Chime SDK available in? How do I choose the best media region to place my meetings?
You can find the full list of media regions that the Amazon Chime SDK supports here, along with how you can determine the best region for a client. Each client application can query for the best region and return it back to the server application, which can use the collected nearest-region information from each client to select a region for the meeting. This region can then be passed as the MediaRegion parameter to CreateMeeting or CreateMeetingWithAttendees.
How do I choose video resolution, frame rate and bitrate?
Applications built with the Amazon Chime SDK for JavaScript can adjust video parameters before a meeting begins by using the chooseVideoInputQuality and setVideoMaxBandwidthKbps APIs.
How can I stream music or video into a meeting?
You can use the [AudioVideoFacade.startContentShare(MediaStream)](https://aws.github. io/amazon-chime-sdk-js/interfaces/audiovideofacade.html#startcontentshare) API to stream audio and/or video content to the meetings. See the meeting demo application for an example of how to achieve this.
When I stream video in Chrome, other attendees see a black screen. Is this a known issue?
The AudioVideoFacade.startContentShare(MediaStream) API uses the HTMLMediaElement.captureStream API to stream video content content to the meeting. Chrome 88 and above have a known issue that the captureStream API does not send any data.
As a workaround, you can turn hardware acceleration off in Chrome (version 88.0.4324.146 and above) and then stream video. Go to Settings (
chrome://settings
), scroll down to System, and turn off "Use hardware acceleration when available".How do I broadcast an Amazon Chime SDK meeting?
You can deploy a web application broadcasting solution similar to the Amazon Chime Meeting Broadcasting Demo to broadcast an Amazon Chime SDK meeting to RTMP-enabled streaming services by instead using a
MEETING_URL
consisting of the URL to the meeting to be broadcasted.How can I adjust my application to perform better under different network conditions?
See this guide to learn how to monitor uplink and downlink bandwidth and what mitigations exist for different kinds of impairment.
Does Amazon Chime SDK support simulcast?
The Amazon Chime SDK supports simulcast for Chromium-based browsers. See this technical guide for more information.
Does the SDK support remote mute where one attendee can mute another?
Remote mute is the ability of one attendee in a meeting to mute another attendee. This feature is currently not supported server-side by the SDK. However, you can use Amazon Chime SDK Data Messages to send a message containing the attendee or attendees that should mute, and clients can mute themselves when they receive those messages.
How do I get connection indicator for media quality?
The getObservableVideoMetrics API exposes video quality statistics. The
getObservableVideoMetrics
API returns following metrics:See this guide for more information.
Demos
I want to build a React application that uses the Amazon Chime SDK. Do you have a sample application that I can reference?
See this blog post and demo for a building a virtual classroom using the Amazon Chime SDK for JavaScript.
I want to build a React Native application that uses the Amazon Chime SDK. Do you have a sample application I can reference?
There is a React Native demo here.
Do I get billed for using the demos?
Your account will get billed for attendee minutes and for any other AWS resources used by the demo. Please use AWS Cost Explorer for details on cost breakdown.
Does Amazon Chime SDK support recording functionality?
Yes. You can record to Amazon S3 using media capture pipelines, or capture from a web browser. [This blog post](https://aws.amazon. com/blogs/business-productivity/how-to-enable-client-side-recording-using-the-amazon-chime-sdk/) and demo show how to enable client-side recording.
Debugging
How can I get Amazon Chime SDK logs for debugging?
Applications can get logs from Chime SDK by passing instances of
Logger
when instantiating the MeetingSession object. Amazon Chime SDK has some default implementations of logger that your application can use, such as ConsoleLogger which logs into the browser console, POSTLogger which logs in Amazon CloudWatch and MultiLogger which logs in multiple destinations.How do I file an issue for the Amazon Chime SDK for JavaScript?
You can use our bug template to file issues with logs (it is helpful to set the logging level as INFO) and exact reproduction steps. To help you faster, you can check the usage of the API in our API overview, demos and the usage section in our Readme. In addition search our issues database as your concern may have been addressed previously and mitigations may have been posted.
Networking
What are the subnets and ports used by an application using the AWS SDK?
An application which calls Amazon Chime APIs via the AWS SDK, like CreateMeeting, connects to the global service endpoint in the
us-east-1
region: service.chime.aws.amazon.com, or service-fips.chime.aws.amazon.com withTCP:443
.The URIs resolve to IP addresses in the
AMAZON
subnets forus-east-1
, as published in the AWS ip-ranges.json.What are the subnets and ports used by a client running the Amazon Chime SDK?
A client running the Amazon Chime SDK connects to the Amazon Chime service via URIs (never direct IP addresses) that are part of the
*.chime.aws
domain. The URIs resolve to IP addresses in theCHIME_MEETINGS
subnets, as published in the AWS ip-ranges.json, which is currently a single subnet:99.77.128.0/18
.The Amazon Chime SDK will use
TCP:443
for https and websocket connectivity, andUDP:3478
for media. IfUDP:3478
is blocked, the SDK falls back to TCP. However the video experience will be poor, and audio will use a region specific subnet assigned by Amazon Elastic Compute Cloud (Amazon EC2).Some features such as Amazon Voice Focus require accessing Amazon CloudFront.
Can a client running the Amazon Chime SDK connect to the service via a proxy?
The Amazon Chime SDK has URL rewriter hooks that the application builder can use to munge the URLs to traverse unauthenticated proxies. When traversing a proxy, all media is sent over TCP which impacts the user experience.
Mobile browser
Is screen capture supported on mobile browsers?
Amazon Chime SDK for JavaScript applications do not support content sharing on mobile browsers because a key dependency, WebRTC's getDisplayMedia is not available on these browsers. Clients joining from these devices can still view content shared by other participants in the call.
Will Amazon Chime SDK for JavaScript meetings work in Chrome and Firefox in iOS?
Yes, the Amazon Chime JS SDK supports Chrome and Firefox on iOS. Refer to the official Amazon Chime SDK Documentation for more information: https://docs.aws.amazon.com/chime-sdk/latest/dg/meetings-sdk.html#mtg-browsers.
I notice that my clients lose audio and drop from the meeting if the Chrome browser on Android stays in background for several minutes, is that a known issue?
This is a known issue and happens primarily due to this Chromium bug. At present we do not have a workaround.
I only see iPhone or iPad microphone as audio input in iOS device, is that a known issue?
iOS Safari/Chrome/Firefox have a known issue where the device selection list only lists one audio input device even when there are multiple. For example , if you plug in a wired headset to your iPhone, it will show up as iPhone microphone replacing the internal mic. For more information, please refer to the Webkit issue.
I can hear clicking noise from an attendee using iPhone X devices (X, XS, and XR).
This was a known issue on iPhone X devices (X, XS, and XR) when using AudioContext-based APIs in iOS Safari 13 and below. Please upgrade your device to iOS 14 and try again. For more information, see our comment in the WebKit issue.
I cannot hear audio from other attendees using iOS devices after I unplug my wired headset.
iOS Safari/Chrome/Firefox browsers have a known issue where they do not automatically switch to the iOS internal speaker after users unplug their wired headset. For more information, please refer to the Webkit issue.
I notice that if I turn on camera and put the browsers in background, others in the meeting will see black tile in Safari/Chrome/Firefox in iOS and frozen tile in Chrome in Android, is this a known issue?
This is the default behavior that is specific to each browser. In Android, the video stream is muted when in background and thus, the video will show the last frame. Note that for Android, if an attendee joins later after the video stream is in background, it will show as a blank tile since the last frame is blank. For better user experience, we recommend considering Chime SDK iOS and Chime SDK Android.
When I join a meeting in Chrome in Android 8 or 9 with speakerphone, other people could not hear me. Switch to default mic fixes the issue.
This seems to be a bug with Android 8 or 9 when using getUserMedia with speakerphone device Id that the audio stream will end after a brief moment. Using default device Id will fix this issue. Note that this only happens if users select speakerphone first. If you use default device when joining the meeting then switch to Speakerphone, this issue does not happen.
Why can I not grab device labels in Android Webview?
This is a bug with Chromium WebView. There is currently no fix for this issue, but you are able to provide default labels for devices.
I see a slate which says "Your client does not support hardware acceleration" when I enable video on my device?
This error indicates that the device you are using does not support hardware acceleration decoding. However this does not impact the ability of this user to participate in Amazon Chime SDK meetings as the device can render and transmit VP8 streams to other parties in the call. Specifically for Chrome, you will need to enable Simulcast. In some cases, H.264 may be missing from the initial SDP offer tracking Chromium bug) causing this slate to appear. Rejoining the meeting can fix the videos to be rendered once again.
I am not able to join an Amazon Chime SDK meeting from an Android 11 device running Chromium 83 based browsers, such as Samsung Internet (Version 13) or Chrome (Version 83). Is this a known issue?
This is a bug on Android 11 running Chromium 83 based browsers. You will observe this issue on the Samsung Internet browser (Version 13) since it is based on Chromium 83. Please check ICE gathering stalls in Chrome on Android 11 bug for more information. This issue is not observed on the Samsung Internet browser (Version 12) or the latest Chrome for Android browser when tested on an Android 11 device.
Does Amazon Voice Focus support the Samsung Internet browser?
Yes, Amazon Voice Focus supports the Samsung Internet browser (Chromium 83 or lower). However, it leads to a poor user experience because the preferred Chromium version is 87 or higher. Please check Amazon Voice Focus browser compatibility matrix in Amazon Voice Focus guide.
Audio and video
My clients are unable to join the meeting and I see
navigator.mediaDevices is undefined
, what could be the reason?Amazon Chime SDK for JavaScript uses WebRTC’s getUserMedia() when you invoke the
startAudioInput
orstartVideoInput
APIs which can operate in secure contexts inside a browser only for privacy concerns so you will need to access your browsers using HTTPS://. The hostnamelocalhost
and the loopback address127.0.0.1
are exceptions.How can I create a video tile layout for my application?
Applications that show multiple video tiles on the screen will need to decide where to place the underlying video elements and how to apply CSS styling. Here are a few things to consider as you develop the tile layout for your application:
VideoTileState
videoStreamContentWidth and videoStreamContentHeight properties to determine the aspect ratio of the content.resize
event listeners on the HTMLVideoElement to listen to intrinsic resolution from the video content.object-fit:cover
to the HTML element that will contain the video to crop and scale the video to the aspect ratio of the video element.object-fit:contain
to the HTML element that will contain the video to ensure that all video content can be seen.After leaving a meeting, the camera LED is still on indicating that the camera has not been released. What could be wrong?
When the camera LED remains on, it does not necessarily mean the device is broadcasting to the remote attendees. The LED will remain on until all media streams that use the device are released (its tracks are stopped). The following API methods release media streams.
My clients are unable to successfully join audio calls from Safari, they get a
failed to get audio device for constraints null: Type error
, what could be the issue?This error message is an indication that the browser application did not successfully acquire the media stream for audio or video from the device before the meeting starts. Application has not passed in the right device Id to the
startVideoInput
API. In this case you will see the following entry in the log where an empty string afterstartVideoInput
:This applies for video input as well.
How can I show a custom UX when the browser prompts the user for permission to use microphone and camera?
Device labels are privileged since they add to the fingerprinting surface area of the browser session. In Chrome private tabs and in all Firefox tabs, the labels can only be read once a MediaStream is active. How to deal with this restriction depends on the desired UX. The device controller includes an injectable device label trigger which allows you to perform custom behavior in case there are no labels, such as creating a temporary audio/video stream to unlock the device names, which is the default behavior.
You may want to override this behavior to provide a custom UX such as a prompt explaining why microphone and camera access is being asked for by supplying your own function to setDeviceLabelTrigger(). See the meeting demo application for an example.
How can I speed up my meeting join times?
The most significant improvement comes from choosing the right region to host your meeting, as discussed earlier in this FAQ.
Meeting join comprises several steps, one of which is establishing a signaling connection. You can front-load this work by specifying
{ signalingOnly: true }
in a call tostart
as early as possible in your application — e.g., in a device picker or lobby view — and then callingstart
again to finish joining the meeting. The attendee will not be shown as having joined the meeting until the secondstart
call completes.Messaging
How do I receive Amazon Chime SDK channel messages without using the Amazon Chime SDK for JavaScript?
Follow the instructions in the "Using websockets to receive messages" developer guide. To sign the URL in Python, use the example code in the GitHub issue #1241.
Mobile SDK
How to determine if a meeting session stop will be self-recoverable or terminal?
Your application should not rely on
MeetingSessionStatusCode
for determining if the session stop is self-recoverable or terminal, instead, your should subscribe toAudioVideoObserver
callbacks. When a self-recoverable session stop happens(i.e. caused by a poor network connection),AudioVideoObserver.audioSessionDidDrop()
will be triggered, and Chime SDK will retry connecting automatically, if the session is successfully reconnected,AudioVideoObserver.audioSessionDidStart(reconnecting: true)
will be triggered, your application should start handling the success of the reonnecting at this point; when a terminal session stop happens or retries have been exhausted,AudioVideoObserver.audioSessionDidStopWithStatus(MeetingSessionStatus)
will be triggered, in this case any further retry will not be helpful, you application should handle the session stop accordingly based on theMeetingSessionStatusCode
, and notify user if needed.What does each
MeetingSessionStatusCode
mean?The definition of each
MeetingSessionStatusCode
can be found here for iOS and here for Android.How should I handle each
MeetingSessionStatusCode
in my application?MeetingSessionStatusCode
provides additional details for the MeetingSessionStatus received for a session. The primary use is in callbacks of AudioVideoObserver. Specifically, they are utilized inAudioVideoObserver.audioSessionDidStopWithStatus(MeetingSessionStatus)
/AudioVideoObserver.videoSessionDidStartWithStatus(MeetingSessionStatus)
/AudioVideoObserver.videoSessionDidStopWithStatus(MeetingSessionStatus)
for iOS, and their equivalents for Android. There are also usages in ReplicatedMeetings, they have been documented separately(iOS/Android).These status codes can be used for logging, debugging, and notification to end users, but in most cases should not be used for any retry behavior, as Chime SDK will already be retrying non-terminal errors. The table below illustrates how each code should be handled.
MeetingSessionStatusCode
audioSessionDidStopWithStatus(MeetingSessionStatus)
videoSessionDidStartWithStatus(MeetingSessionStatus)
videoSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
videoSessionDidStopWithStatus(MeetingSessionStatus)
connectionDidBecomePoor()
AudioVideoObserver.connectionDidBecomePoor()
will be triggered instead. You can subscribe to this callback and notify your application user about the network issue, however, you should not retry connect the meeting session, Chime SDK will handle it. When retries are exhausted, the meeting session will stop completely,audioSessionDidStopWithStatus(MeetingSessionStatus)
will be triggered then.audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
videoSessionDidStopWithStatus(MeetingSessionStatus)
videoSessionDidStartWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
audioSessionDidStopWithStatus(MeetingSessionStatus)
How to reproduce each
MeetingSessionStatusCode
?Below is the list of
MeetingSessionStatusCode
that you can reproduce for each AudioVideoObserver callback, please note some of the codes(i.e., audioServiceUnavailable) due to Amazon Chime SDK service issues, which cannot be reproduced on mobile Chime SDK client.MeetingSessionStatusCode
Give feedback on this guide