Choosing Configuration


To choose a configuration for video streams, we recommend you carefully consider the below use cases, the intended layout, and how the app will be used. Different configurations will have different effects on bandwidth consumption, performance, and battery life.

  • Remote Assist (TeleHealth use case)
  • Remote Learning
  • Video Stream Priority enumeration.

Remote Assist (TeleHealth use case)

There may be several types of scenarios like one-one appointments, two doctors and one-patient appointments, group therapies, virtual consultations, and more. (TeleHealth use case).

Here is an example of how your remote video must fill the entire screen with a high-quality stream.

List<VideoStreamConfiguration> configuration = new ArrayList<>();
      streamConfiguration.add(
                            new VideoStreamConfiguration(
                              "<participant ID>",
                              StreamQuality.R720p_30fps,
                              StreamPriority.High
                            )
                    );
val configuration = listOf(VideoStreamConfiguration("<Participant ID>", StreamQuality.R720p_30fps, StreamPriority.High))

You can alter the stream quality with your choice's high, medium, and low quality.

Remote Assist in Sample App

The BlueJeans SDK sample app has an example of how a remote assist use case can be built using video streams. The remote assist use case in the sample app is based on certain constraints.

  • There is only one remote participant whose video is on.

If the above constraint is not met then the sample app will not show the remote video.

Note
The BlueJeans SDK will downgrade the video stream if it exceeds the available bandwidth. We recommend that you only request video quality when you need it. Otherwise, the user's bandwidth will be consumed more than necessary.

Remote Learning

The remote learning use case is given below, where you may have a virtual classroom in which the teacher/trainer video should be a bigger share (higher resolution) of the view space compared to other student video tiles with lower resolution.

Use the following configuration where the teacher/trainer/moderator is shown in screen view with high-resolution (720p)

List<VideoStreamConfiguration> configuration = new ArrayList<>();
      streamConfiguration.add(
                            new VideoStreamConfiguration(
                              "<Moderator_ID>",
                              StreamQuality.R720p_30fps,
                              StreamPriority.High
                            )
                    );
val moderatorConfiguration = listOf(
              VideoStreamConfiguration("<Moderator_ID> ", StreamQuality.R720p_30fps, StreamPriority.High)
              )

Rest all participants/students may wish to see a grid of small tiles at low resolution (90p 7fps).

List<VideoStreamConfiguration> configuration = new ArrayList<>();
      streamConfiguration.add(
             new VideoStreamConfiguration(
                  "<Student1_ID>", StreamQuality.R90p_7fps, StreamPriority.Low
                ));
      streamConfiguration.add(
             new VideoStreamConfiguration(
                  "<Student2_ID>", StreamQuality.R90p_7fps, StreamPriority.Low
                ));
      streamConfiguration.add(
             new VideoStreamConfiguration(
                   "<Student3_ID>", StreamQuality.R90p_7fps, StreamPriority.Low
                ));
      streamConfiguration.add(
             new VideoStreamConfiguration(
                  "<Student4_ID>", StreamQuality.R90p_7fps, StreamPriority.Low
                ));
      streamConfiguration.add(
             new VideoStreamConfiguration(
                  "<Student5_ID>", StreamQuality.R90p_7fps, StreamPriority.Low
                 ));
      streamConfiguration.add(
             new VideoStreamConfiguration(
                  "<Student6_ID>", StreamQuality.R90p_7fps, StreamPriority.Low
                 ));
 val studentsConfiguration = listOf(
         VideoStreamConfiguration("<Student1_ID>", StreamQuality.R90p_7fps, StreamPriority.Low),
         VideoStreamConfiguration("<Student2_ID>", StreamQuality.R90p_7fps, StreamPriority.Low),
         VideoStreamConfiguration("<Student3_ID>", StreamQuality.R90p_7fps, StreamPriority.Low),
         VideoStreamConfiguration("<Student4_ID>", StreamQuality.R90p_7fps, StreamPriority.Low),
         VideoStreamConfiguration("<Student5_ID>", StreamQuality.R90p_7fps, StreamPriority.Low),
         VideoStreamConfiguration("<Student6_ID>", StreamQuality.R90p_7fps, StreamPriority.Low)
      )

Remote Learning in Sample App

The BlueJeans SDK sample app has an example of how a remote learning use case can be built using video streams. The remote learning use case in the sample app is based on certain constraints.

  • There is only one moderator present in the meeting whose video is on. This moderator is treated as a teacher. The teacher's video should always be on.
  • Rest of the remote participants are treated as students. Students are always non-moderators.
  • At a time, only 6 students whose video is on are shown on the screen along with the teacher. Students whose videos are off are never rendered on the screen.
  • In landscape mode, the student's view gets hidden and the teacher's video feed occupies the entire space on the screen.

If any of the above constraints are not met then the sample app will not show the remote video.

Video Stream Priority

Stream prioritization provides you to have more control over the playback video by allowing you to specify priority order for the streams. The video streams are prioritized is as follows:

  • The high-priority video stream receives the video of the most recent speaking participant.
  • Higher priority streams are allocated bandwidth before lower priority streams.
  • The overall configuration is ordered from highest to lowest priority.

In order to guarantee a particular stream will receive a higher resolution than other streams, the stream should have a distinct, and higher priority than the other streams.

The below use case explains the scenario where stream priority will be chosen according to the active speakers. An active speaker will be shown on the screen with 720p, the preceding speaker will be shown 360p with 30fps, the earlier preceding speaker will be shown 360p with 15 fps, and 6 more participants shown 180p at 15 fps with low stream priority.

List<VideoStreamConfiguration> configuration = new ArrayList<>();
      streamConfiguration.add(new VideoStreamConfiguration("<active speaker ID>", 
                                                           StreamQuality.R720p_30fps, StreamPriority.High));
      streamConfiguration.add(new VideoStreamConfiguration("<preceding speaker ID>", 
                                                           StreamQuality.R360p_30fps, StreamPriority.Medium));
      streamConfiguration.add(new VideoStreamConfiguration("<earlier speaker ID>", 
                                                           StreamQuality.R360p_15fps, StreamPriority.Medium));
      streamConfiguration.add(new VideoStreamConfiguration("<other participant ID>", 
                                                           StreamQuality.R180p_15fps, StreamPriority.Low));
      streamConfiguration.add(new VideoStreamConfiguration("<other participant ID>", 
                                                           StreamQuality.R180p_15fps, StreamPriority.Low));
      streamConfiguration.add(new VideoStreamConfiguration("<other participant ID>", 
                                                           StreamQuality.R180p_15fps, StreamPriority.Low));
      streamConfiguration.add(new VideoStreamConfiguration("<other participant ID>", 
                                                           StreamQuality.R180p_15fps, StreamPriority.Low));
      streamConfiguration.add(new VideoStreamConfiguration("<other participant ID>", 
                                                           StreamQuality.R180p_15fps, StreamPriority.Low));
      streamConfiguration.add(new VideoStreamConfiguration("<other participant ID>", 
                                                           StreamQuality.R180p_15fps, StreamPriority.Low))
val configuration = listOf(
VideoStreamConfiguration("<active speaker ID>", StreamQuality.R720p_30fps, StreamPriority.High),
VideoStreamConfiguration("<preceding speaker ID>", StreamQuality.R360p_30fps, StreamPriority.Medium),
VideoStreamConfiguration("<earlier speaker ID>", StreamQuality.R360p_15fps, StreamPriority.Medium),
VideoStreamConfiguration("<other participant ID>", StreamQuality.R180p_15fps, StreamPriority.Low),
VideoStreamConfiguration("<other participant ID>", StreamQuality.R180p_15fps, StreamPriority.Low),
VideoStreamConfiguration("<other participant ID>", StreamQuality.R180p_15fps, StreamPriority.Low),
VideoStreamConfiguration("<other participant ID>", StreamQuality.R180p_15fps, StreamPriority.Low),
VideoStreamConfiguration("<other participant ID>", StreamQuality.R180p_15fps, StreamPriority.Low),
VideoStreamConfiguration("<other participant ID>", StreamQuality.R180p_15fps, StreamPriority.Low),
            )
    

User Experience Recommendation

  • You can only have one video view per stream of video, i.e., you cannot render the same video in two different views on screen.
  • You can request a specific video quality, but it may not be provided depending on the network or other factors.

Note

You should only request the quality you require (e.g. The 720p video should not be requested for a small thumbnail because it is not necessary, consumes more bandwidth, and consumes more power).