Skip to contentSkip to navigationSkip to topbar
Rate this page:
On this page

Migrating From 5.x to 6.x


(warning)

Warning

This documentation is for reference only. We are no longer onboarding new customers to Programmable Video. Existing customers can continue to use the product until December 5, 2026(link takes you to an external page).

We recommend migrating your application to the API provided by our preferred video partner, Zoom. We've prepared this migration guide(link takes you to an external page) to assist you in minimizing any service disruption.

This guide provides an introduction to the 6.x Programmable Video Android SDK and a set of guidelines to migrate an application from 5.x to 6.x.


New Features

new-features page anchor
  • The SDK has been upgraded to use Chromium WebRTC 83
  • The SDK now enables Discontinuous Transmission (DTX)(link takes you to an external page) by default when using the Opus codec. Enabling DTX results in a lower bitrate when silent audio is detected.
  • The capturing and rendering facilities have been updated to allow developers more control, flexibility, and capabilities. This update includes the adoption of WebRTC classes.
  • The SDK includes new callbacks onParticipantReconnecting and onParticipantReconnected to Room.Listener . These callbacks will be raised when a RemoteParticipant is attempting to reconnect to a room due to a signaling network interruption.
  • Room#isRecording() API now accurately reflects the current recording state of the Room . In the previous versions of the SDK, isRecording() could return false positives. The onRecordingStarted(...) and onRecordingStopped(...) callbacks will now be invoked when recording for at least a single track in the Room has started and stopped respectively.

The update to video capturing and rendering includes an adoption of WebRTC classes defined in libwebrtc.jar included with the Video Android SDK. In previous major releases, the SDK would define public APIs with classes defined exclusively in the com.twilio.video package. The SDK will now include public APIs with classes defined in libwebrtc.jar.

Any public APIs that reference a WebRTC class are only compatible with the libwebrtc.jar provided from the Video Android SDK. The classes provided in this artifact are defined under the tvi.webrtc package to ensure side-by-side compatibility with other WebRTC based libraries.

Adopting WebRTC classses in public APIs provides developers already familiar with WebRTC more flexibility when capturing media and rendering media.


To gain a better understanding of the 6.x changes, see the below UML diagrams to help visualize the 5.x and 6.x media APIs.

5.x

5x page anchor

6.x includes an overhaul to the video capturer facilities. LocalVideoTracks are now created with implementations of tvi.webrtc.VideoCapturer and VideoFormats. VideoCapturer remains a part of the SDK as an extension of tvi.webrtc.VideoCapturer, but VideoConstraints have been completely removed in favor of VideoFormats.

Updated Programming Model

updated-programming-model page anchor

When a caller creates a LocalVideoTrack, the following methods of a tvi.webrtc.VideoCapturer are called in the order listed.

  1. isScreencast() - The return value is used to create a tvi.webrtc.VideoSource
  2. initialize(surfaceTextureHelper, context, capturerObserver) - This method is called so the capturer can set up to capture frames. The capturer should retain a reference to the capturer observer.
  3. startCapture(width, height, framerate) - The capturer should start capturing in a format as close as possible to width x height at framerate .

When a caller releases a local video track, the following methods are then called.

  1. stopCapture() - The capturer should stop capturing frames. The SDK expects this method to block until frames have stopped being captured.
  2. dispose() - The capturer should perform any final clean up.
  • VideoPixelFormat has been removed in favor of implementing tvi.webrtc.VideoFrame.Buffer . The SDK includes support for the following buffer types: tvi.webrtc.VideoFrame.TextureBuffer , tvi.webrtc.NV21Buffer , tvi.webrtc.NV12Buffer , and Rgba8888Buffer .
  • VideoCapturer now extends tvi.webrtc.VideoCapturer.
    • getSupportedFormats() has been removed in favor of getCaptureFormat() . This update allows a VideoCapturer to provide a default capture format. For example, the ScreenCapturer returns a capture format based on the device screen dimensions.
  • VideoConstraints has been removed. Developers can now specify a capture format when creating a local video track and the tvi.webrtc.VideoCapturer is responsible for capturing at a format as close as possible to the specified format. The VideoFormat provided to LocalVideoTrack.create(...) takes highest priority over the format returned by VideoCapturer#getCaptureFormat() . The default format for video tracks remains 640x480 at 30 FPS.
  • Removed VideoFrame in favor of tvi.webrtc.VideoFrame .
  • Removed AspectRatio .

If you are implementing a custom VideoCapturer in your application, please take a look at the the Custom Video Capturer Example(link takes you to an external page).

See the code snippets below to learn how to update to the latest Video Capturing API.

5.x

5-x-2 page anchor

_11
// Setup video constraints
_11
VideoConstraints videoConstraints = new VideoConstraints.Builder()
_11
.aspectRatio(VideoConstraints.ASPECT_RATIO_16_9)
_11
.minVideoDimensions(VideoDimensions.CIF_VIDEO_DIMENSIONS)
_11
.maxVideoDimensions(VideoDimensions.HD_720P_VIDEO_DIMENSIONS)
_11
.minFps(5)
_11
.maxFps(24)
_11
.build();
_11
_11
// Add a video track with constraints
_11
LocalVideoTrack localVideoTrack = LocalVideoTrack.create(context, true, cameraCapturer, videoConstraints);


_10
// Setup video format
_10
VideoFormat videoFormat = new VideoFormat(VideoDimensions.HD_720P_VIDEO_DIMENSIONS, 30);
_10
_10
// Add a video track with the format
_10
LocalVideoTrack localVideoTrack = LocalVideoTrack.create(context, true, cameraCapturer, videoFormat);


6.x includes updated video rendering facilities. RemoteVideoTracks and LocalVideoTracks are now rendered with a tvi.webrtc.VideoSink instead of a VideoRenderer. VideoRenderer and VideoRenderer.Listener have been removed in favor of tvi.webrtc.VideoSink and tvi.webrtc.RendererCommon.RendererEvents respectively.

  • Removed VideoRenderer in favor of tvi.webrtc.VideoSink
  • Removed VideoRenderer.Listener in favor of tvi.webrtc.RendererCommon.RendererEvents
  • Removed VideoTrack#addRenderer in favor of VideoTrack#addSink
  • Removed VideoTrack#removeRenderer in favor of VideoTrack#removeSink
  • Updated VideoView#setListener to take a tvi.webrtc.RendererCommon.RendererEvents instead of a VideoRenderer.Listener
  • Updated VideoTextureView#setListener to take a tvi.webrtc.RendererCommon.RendererEvents instead of a VideoRenderer.Listener

If you are implementing a custom VideoRenderer in your application, you will need to now implement the tvi.webrtc.VideoSink interface. Check out the Custom Video Sink Example(link takes you to an external page) to see an example of a concrete implementation of tvi.webrtc.VideoSink.

See the code snippets below to learn how to update to the latest Video Rendering API.


_18
// Rendering a local video track requires an implementation of VideoRenderer
_18
// Let's assume we have added a VideoView in our view hierarchy
_18
VideoView videoView = (VideoView) findViewById(R.id.video_view);
_18
_18
// Render a local video track
_18
localVideoTrack.addRenderer(videoView);
_18
_18
// Render a local video track in a custom video renderer
_18
localVideoTrack.addRenderer(new VideoRenderer() {
_18
@Override
_18
public void renderFrame(@NonNull I420Frame frame) {}
_18
});
_18
_18
// Remove renderer to stop receiving video from a local video track
_18
localVideoTrack.removeRenderer(videoView);
_18
_18
// Release the video track to free native memory resources
_18
localVideoTrack.release();


_18
// Rendering a local video track requires an implementation of VideoSink
_18
// Let's assume we have added a VideoView in our view hierarchy
_18
VideoView videoView = (VideoView) findViewById(R.id.video_view);
_18
_18
// Render a local video track
_18
localVideoTrack.addSink(videoView);
_18
_18
// Render a local video track to a custom video sink
_18
localVideoTrack.addSink(new VideoSink() {
_18
@Override
_18
public void onFrame(VideoFrame videoFrame) {}
_18
});
_18
_18
// Remove sink to stop receiving video from a local video track
_18
localVideoTrack.removeSink(videoView)
_18
_18
// Release the local video track to free native memory resources
_18
localVideoTrack.release();


  • Added a ParticipantState enumeration.
  • Added a getState() method to Participant .
  • Removed the RemoteParticipant.isConnected() method in favor of Participant.getState() .
  • Removed IceOptions.abortOnIceServersTimeout and IceOptions.iceServersTimeout
  • Removed CameraCapturer.CameraSource . CameraCapturer instances are now created using a camera ID as a String . You can use tvi.webrtc.Camera1Enumerator#getDeviceNames() to query the list of supported camera IDs.
  • Updated CameraCapturer#switchCamera() signature to require a camera ID. Users now must specify which camera ID to switch to. This behavior is similar to the Camera2Capturer switch camera behavior.

    The snippet below demonstrates the updated use of CameraCapturer.


_10
// Create the instance
_10
CameraCapturer cameraCapturer = CameraCapturer(context, frontCameraId)
_10
_10
// Switch camera Ids
_10
cameraCapturer.switchCamera(backCameraId)

  • Camera2Capturer.Listener implementations are now optional when creating a Camera2Capturer

Codec Support API Update

codec-support-api-update page anchor

Note that checking for H.264 hardware support changed from v5.x to v6.x. See the Managing Codecs guide to learn how to use the correct syntax.


Rate this page: