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.
We recommend migrating your application to the API provided by our preferred video partner, Zoom. We've prepared this migration guide to assist you in minimizing any service disruption.
The Twilio Programmable Video SDKs use Semantic Versioning.
Maintenance
armv7
and
i386
).
Known Issues
armv7
devices. [ISDK-3063]
armv7
devices. [ISDK-3064]
armv7
devices. [ISDK-3065]
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
This release improves support for local network privacy on iOS 14.0 and iPadOS 14.0. As iOS 14 does not support 32-bit devices, support for the armv7
32 bit processors has been removed from this release.
By default, the SDK no longer uses your local network on iOS 14 and above. Twilio Video balances privacy and performance, blocking communication routes that use your local network inappropriately in Peer-to-Peer Rooms while still ensuring a high rate of direct connections on iOS 14 devices.
If you use Peer-to-Peer Rooms then we recommend that you update your applications to this release in order to prepare for iOS 14. If you need features like multi-party video, network quality or recordings, then use Group Rooms. These Rooms use media servers provided by Twilio that are available on the public internet.
By default, Twilio Video does not access the local network on iOS 14 and above. If you want to allow Twilio Video to use the local network in a Peer-to-Peer Room then you can override the TVILocalNetworkPrivacyPolicy
.
_10let connectOptions = TVIConnectOptions(token: accessToken) { (builder) in_10 // A permissions request may be triggered on iOS 14._10 builder.networkPrivacyPolicy = .allowAll_10})
If you select TVILocalNetworkPolicyAllowAll
then you must add a privacy usage description with the NSLocalNetworkUsageDescription
key in your application's .plist file.
You can find more information about network privacy in our Getting Started Guide.
Bug Fixes
Maintenance
armv7
and
i386
).
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Bug Fixes
TVIPixelFormatYUV420BiPlanarFullRange
or
TVIPixelFormatYUV420BiPlanarVideoRange
formats. [ISDK-2631]
TVICameraSource
might produce distorted frames after being interrupted with
AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient
on iOS 13.0.
#53
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Bug Fixes
TVIVideoSource
, and the source's buffer pool becomes empty.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
This release adds support for publish only Participants (such as a ReplayKit Broadcast Extension) in a Group Room.
Enhancements
TVIConnectOptions.automaticSubscriptionEnabled
to control Track subscription behavior in Group Rooms:
YES
(the default value) causes the Participant to be subscribed to all Tracks that are published in the Room
NO
causes the Participant to be subscribed to none of the Tracks that are published in the Room
NO
has no impact in a Peer-to-Peer Room
_10let connectOptions = TVIConnectOptions(token: accessToken) { (builder) in_10 builder.automaticSubscriptionEnabled = true_10 builder.roomName = "my-room"_10}_10self.room = TwilioVideo.connect(with: connectOptions, delegate: self)
Bug Fixes
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
API Changes
TVIConnectOptions.networkQualityEnabled
property to
YES
when connecting to a Group Room.
TVILocalParticipant.networkQualityLevel
. Note, this will return TVINetworkQualityLevelUnknown
if:
TVIConnectOptions.networkQualityEnabled
property was set to
NO
OR
[TVILocalParticipantDelegate localParticipant:networkQualityLevelDidChange:]
method on your
TVILocalParticipantDelegate
will allow you to receive callbacks when the network quality level changes.
_15@IBAction func connectToRoom(sender: AnyObject) {_15 let connectOptions = TVIConnectOptions(token: accessToken) { (builder) in_15 builder.networkQualityEnabled = true_15 builder.roomName = "my-room"_15 }_15 room = TwilioVideo.connect(with: connectOptions, delegate: self)_15}_15_15..._15_15// MARK: TVILocalParticipantDelegate_15func localParticipant(_ participant: TVILocalParticipant, didChange networkQualityLevel: TVINetworkQualityLevel) {_15_15 print("Network Quality Level Changed: \(networkQualityLevel)")_15}
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Bug Fixes
TVILocalVideoTrack
TVICameraSource
, waiting for its completion handler, and then starting a new
TVICameraSource
could result in the 2nd source being interrupted.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
API Changes
TVIConnectOptions.dominantSpeakerEnabled
property to
YES
when connecting to a Group Room.
TVIRoom.dominantSpeaker
property for a TVIRemoteParticipant
. Note, this will return nil
if:
TVIConnectOptions.dominantSpeakerEnabled
property was set to
NO
OR
TVIRoom.dominantSpeaker
property will return the appropriate
TVIRemoteParticipant
.
[TVIRoomDelegate room:dominantSpeakerDidChange:]
method on your
TVIRoomDelegate
will allow you to receive callbacks when the dominant speaker in a Group Room changes. The
dominantSpeakerDidChange:
argument will contain the
TVIRemoteParticipant
of the dominant speaker, or
nil
if there is no longer a dominant speaker.
_20@IBAction func connectToRoom(sender: AnyObject) {_20 let connectOptions = TVIConnectOptions(token: accessToken) { (builder) in_20 builder.dominantSpeakerEnabled = true_20 builder.roomName = "my-room"_20 }_20 room = TwilioVideo.connect(with: connectOptions, delegate: self)_20}_20_20..._20_20// MARK: TVIRoomDelegate_20func room(_ room: TVIRoom, dominantSpeakerDidChange participant: TVIRemoteParticipant?) {_20 var identity = "N/A"_20_20 if let participant = participant {_20 identity = participant.identity_20 }_20_20 print("Dominant Speaker Changed: \(identity)")_20}
Bug Fixes
[TVIRoom getStatsWithBlock:]
will execute the provided block if called while
TVIRoom.state == TVIRoomStateReconnecting
. [CSDK-2787]
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
API Changes
TVIRoomStateReconnecting
to signify that the Client is attempting to reconnect to the Room due to a network disruption.
TVIRoomStateConnected
, then you may want to update it to include
TVIRoomStateReconnecting
.
_10// Before_10func updateStatsDisplay() {_10 if let room = self.room,_10 room.state == .connected {_10 room.getStatsWith { ([TVIStatsReport]) in_10 // Populate UI with stats report._10 }_10 }_10}
_10// After_10func updateStatsDisplay() {_10 if let room = self.room,_10 room.state == .connected || room.state == .reconnecting {_10 room.getStatsWith { ([TVIStatsReport]) in_10 // Populate UI with stats report._10 }_10 }_10}
TVIRoomDelegate
[TVIRoomDelegate room:isReconnectingWithError:]
- Invoked when the Client experiences a network interruption in signaling or media. The
TVIRoom.state
property will transition to
TVIRoomStateReconnecting
and the Client will attempt to restore the connection.
[TVIRoomDelegate didReconnectToRoom:]
- Invoked after the Client successfully reconnects to the Room. If the reconnection attempts fail,
[TVIRoomDelegate room\:didDisconnectWithError:]
is invoked instead.
Enhancements
TwilioVideo.framework
is now built with Xcode 10.1.
Bug Fixes
Known Issues
[TVIRoom getStatsWithBlock:]
will not execute the provided block if called while
TVIRoom.state == TVIRoomStateReconnecting
. [CSDK-2787]
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
API Changes
TVICameraSource.torchLevel
TVICameraSource.torchMode
TVICameraSource.zoomFactor
TVICameraSourceOptions.torchMode
and
TVICameraSourceOptions.torchLevel
.
TVILocalVideoTrack.source
property to retrieve the
TVIVideoSource
used when creating the local video track.
Bug Fixes
TVILocalVideoTrack.capturer
and
TVILocalVideoTrack.constraints
no longer return
nil
when called while the
VideoSource
APIs are being used. [ISDK-2331]
TVICameraSourceStartedBlock
is now fired when calling
[TVICameraSource selectCaptureDevice:completion:]
repeatedly, with the same device. [ISDK-2321]
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
This preview refines the TVICameraSource
APIs, introducing manual orientation, torch and zoom controls. We've also squashed a few bugs with TVIVideoSource
and picked up the latest fixes from the 2.5.6 release.
API Changes
TVICameraSource
if the supplied
TVICameraSourceOptions.torchMode
is set to
AVCaptureTorchModeOn
. [ISDK-2327]
[TVICameraSource initWithDelegate:]
method.
TVICameraSourceOptions
and
TVICameraSourceOptionsBuilder
classes, including options for the torch and camera zoom.
[TVICameraSource initWithPreviewEnabled:delegate:]
with
[TVICameraSource initWithOptions:delegate:]
, which accepts
TVICameraSourceOptions
.
TVICameraSourceStartedBlock
now includes a
TVIVideoFormat
argument.
Enhancements
[TVICameraSource updateVideoOrientation:]
method to enable manual control of orientation tags.
#324
TVIVideoOrientationIsValid
.
TVIConnectOptions
for improved resource management. [ISDK-1943]
Bug Fixes
TVIVideoOrientationDown
. [ISDK-2307]
TVIVideoSink.sourceRequirements
is populated after calling
TVIVideoSink.onFormatRequest()
. [ISDK-2309]
TVIAudioSink
from a
TVIAudioTrack
.
TVICameraSource.init
is now correctly marked as
null_unspecified
.
TVICameraSourceStartedBlock
is now fired when calling
[TVICameraSource selectCaptureDevice:format:completion:]
repeatedly, with different formats.
[TVICameraSource supportedFormatsForDevice:]
no longer returns duplicate formats.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVICameraSourceStartedBlock
is not fired when calling
[TVICameraSource selectCaptureDevice:completion:]
repeatedly, with the same device. [ISDK-2321]
This release introduces new TVIVideoSource
APIs as a replacement for TVIVideoCapturer
. A Source is a producer of video content (such as frames from the Camera), and delivers that content to a Sink.
We have updated ReplayKitExample to use the TVIVideoSource
APIs, and you can try this app today. We will be updating our other examples during the preview period.
As part of this transition we are deprecating the following classes, protocols, and methods:
TVICameraCapturer
TVICameraCapturerDelegate
TVILocalVideoTrack.capturer
TVILocalVideoTrack.constraints
TVILocalVideoTrack.trackWithCapturer:
TVILocalVideoTrack.trackWithCapturer:enabled:constraints:name:
TVIVideoCapturer
TVIVideoCaptureConsumer
TVIVideoConstraints
TVIVideoConstraintsBuilder
The existing TVIVideoCapturer
APIs will continue to function until the next major release of our SDK. The following replacement APIs are now available in this preview:
TVICameraSource
TVICameraSourceDelegate
TVILocalVideoTrack.trackWithSource:
TVILocalVideoTrack.trackWithSource:enabled:name:
TVIVideoSource
TVIVideoSink
Enhancements
TVICameraSource
and
[TVIVideoSource requestOutputFormat:]
. For example, you can now stream square 480x480 video for multi-party conferencing scenarios.
TVIVideoSource
is used.
Bug Fixes
TVIVideoFrame
to produce an I420 buffer (suitable for VP8 and VP9 encoding) no longer stretches the source image.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIVideoOrientationDown
. [ISDK-2307]
TVIVideoSink.sourceRequirements
is not populated after calling
TVIVideoSink.onFormatRequest()
. [ISDK-2309]
Bug Fixes
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Bug Fixes
TVIVideoView
could display video which was rotated incorrectly on an iPhone XS, iPhone XS Max, or iPhone XR running iOS 12.1.
#326
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Enhancements
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIVideoView
can display video which is rotated incorrectly on an iPhone XS, iPhone XS Max, or iPhone XR running iOS 12.1.
#326
Enhancements
Bug Fixes
MetalKit.framework
optional so apps consuming
TwilioVideo.framework
can be run in an iOS 9.x simulator.
#130
[ISDK-2207]
TVILocalVideoTrack
using OpenGL renderer. [ISDK-2211]
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Enhancements
TwilioVideo
is now built and distributed as both a dynamic framework,
TwilioVideo
, and a static library,
libTwilioVideo.a
. The static library is not available as a Carthage or CocoaPods dependency and is only available as a manual download from the
Video iOS Releases
page.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Bug Fixes
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
API Changes
TVIScreenCapturer
on iOS 12.0 and above, due to performance issues on some device and
UIView
combinations. We recommend that anyone who is interested in sharing their screen use
ReplayKit
, along with a custom
TVIVideoCapturer
instead. We are putting the finishing touches on a new ReplayKit example
app
.
#303
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
Bug Fixes
signaling::PeerConnectionSignaling
processes a close message.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
Enhancements
TwilioVideo.framework
is now built with Xcode 9.4.1.
[TVIRoomDelegate room\:didDisconnectWithError:]
callback with the error code
TVIErrorRoomRoomCompletedError
.
softwareAecEnabled
property to
TVIAudioOptions
to use the software acoustic echo cancellation.
TwilioVideo.framework
now uses C++14 internally.
Bug Fixes
TVIRoom
is destroyed while fetching ICE servers. [CSDK-2499]
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
We have promoted 2.3.0-preview2 to 2.3.0. This release is based on WebRTC 67 and also resolves conflicts when using Twilio Video alongside other WebRTC based dependencies.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
Features
TVI
. It is now possible to use the Video SDK side by side with any other Chromium WebRTC based dependency in the same application.
API Changes
TVIVideoRenderingType.OpenGLES
on iOS 12.0+ to match Apple's deprecation notice for
OpenGLES.framework
.
Bug Fixes
TVIVideoRenderingType.OpenGLES
renderer doesn't display i420, and y420 frames produced by a
TVIVideoCapturer
. [ISDK-2078]
TVIIceOptions.iceServersTimeout
to increase reliability.
AVAudioSession.inputNumberOfChannels == 0
and
TVIDefaultAudioDevice
is used. [ISDK-2143]
TVIDefaultAudioDevice
no longer overrides
AVAudioSession.preferredInputNumberOfChannels
and
AVAudioSession.preferredOutputNumberOfChannels
after executing your block. The default block has also been updated to set channel preferences.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
Enhancements
TVIAVAudioSessionConfigurationBlock
now configures
AVAudioSession.preferredIOBufferDuration
to 20 milliseconds by default, to match changes in WebRTC.
API Changes
TVIAudioOptions.levelControl
and
TVIAudioOptions.levelControlInitialPeakLevelDBFS
properties as they are no longer supported in Chromium WebRTC 67.
TVIAudioSink
to a
TVIRemoteAudioTrack
.
Bug Fixes
[TVIRoom getStatsWithBlock:]
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIVideoRenderingTypeOpenGLES
renderer doesn't display i420, and y420 frames produced by a
TVIVideoCapturer
. [ISDK-2078]
AVAudioSession.inputNumberOfChannels == 0
and
TVIDefaultAudioDevice
is used. [ISDK-2143]
UIApplication
APIs from a background thread. [ISDK-2051]
TVILocalVideoTrack
published with the H.264 codec. [ISDK-2210]
#308
Enhancements
TVIVideoViewDelegate
.
Bug Fixes
[TVIRoom getStatsWithBlock:]
.
TVIIceOptions.iceServersTimeout
to increase reliability.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Improvements
Bug Fixes
[TVIRoomDelegate room\:didDisconnectWithError:]
callbacks by up to 1 second.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
[TVIRoom getStatsWithBlock:]
.
Enhancements
TVIRoom
's
delegate
property is no longer read only.
#13
TVIVideoView
, the black frame is rendered synchronously rather than on the next vsync.
Bug Fixes
@return
documentation for the
[TwilioVideo connectWithOptions:delegate:]
method.
#14
[TVIVp8Codec isEqual:]
returned
YES
when
TVIVp8Codec.isSimulcast
did not match.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
[TVIRoom getStatsWithBlock:]
.
Enhancements
TwilioVideo.framework
is now built with the Xcode 9.3 toolchain.
TVIVideoRenderer
collection in
TVIVideoTrack
.
TVIVp8Codec
to enable simulcast. Enabling simulcast causes the encoder to generate multiple spatial and temporal layers for the video that is published. Simulcast should only be enabled in a Group Room.
TVIVideoView
could be incorrect.
#266
TVIIceOptions
to control how ICE servers are fetched.
abortOnIceServersTimeout
- Require ICE server fetching to complete, and disallow the use of default STUN servers if the request fails.
iceServersTimeout
- A custom timeout to use when fetching ICE servers.
Bug Fixes
TVIRemoteDataTrack
and disconnecting from a Room at the same time.
PeerConnectionSignaling
teardown.
PeerConnectionSignaling
which could cause DTLS roles to be negotiated incorrectly in a multi-party Peer-to-Peer Room.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
Features
TVIVideoView
now uses
MTKView
from MetalKit.framework when Metal rendering is selected.
Bug Fixes
TVIVideoView
and an internal class named
TVIDisplayLinkTimer
when Metal rendering is used.
UIView
APIs on a background thread while invalidating a
TVIVideoView
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIVideoView
could be incorrect.
#266
This is our first Generally Available (GA) 2.0 release.
Thank you for the feedback that you've provided on our preview and beta releases. This version includes some minor API changes around TVIVideoFrame
and TVIVideoRenderer
/ TVIVideoView
reuse, but otherwise is very similar to 2.0.0-beta4.
Features
TVIVideoFrame.timestamp
now uses
CMTime
instead of
int64_t
(in microseconds). We've found that developers writing custom
TVIVideoCapturer
s are sometimes confused at having to convert time into microseconds. Furthermore, this conversion can be a destructive operation which causes the original timescale to be lost. For those working with
CFTimeInterval
we've also added an initializer which accepts this argument. The following code snippet demonstrates how to modify your capture logic when dealing with a source which produces
CMSampleBuffer
s.
_10// Before_10- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {_10 CMTime presentationTimestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);_10 int64_t timestamp = (int64_t)(CMTimeGetSeconds( presentationTimestamp ) * INT64_C( 1000000 ));_10 TVIVideoFrame *frame = [[TVIVideoFrame alloc] initWithTimestamp:timestamp_10 buffer:CMSampleBufferGetImageBuffer( sampleBuffer )_10 orientation:TVIVideoOrientationUp];_10_10 [_captureConsumer consumeCapturedFrame:frame];_10}
_10// After_10- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {_10 CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);_10 TVIVideoFrame *frame = [[TVIVideoFrame alloc] initWithTimestamp:timestamp_10 buffer:CMSampleBufferGetImageBuffer( sampleBuffer )_10 orientation:TVIVideoOrientationUp];_10_10 [_captureConsumer consumeCapturedFrame:frame];_10}
TVIVideoFrame
initializers are now marked as
nullable
instead of
null_unspecified
.
invalidateRenderer
method to the
TVIVideoRenderer
protocol. This method, if implemented, will be invoked when a
TVIVideoRenderer
object is removed from a video track by calling the
[TVIVideoTrack removeRenderer:]
method. This method allows the
TVIVideoRenderer
to perform any necessary cleanup that is required, for instance when the
TVIVideoRender
is to be reused with a different video track.
TVIVideoView
implements the invalidateRenderer
protocol method and will now better support reusing the view between different video tracks. #240 Now, when a TVIVideoView
is removed as a renderer for a video track, the following will occur:
hasVideoData
flag is reset. This will allow the
[TVIVideoViewDelegate videoViewDidReceiveData:]
method to be fired again when new video data arrives.
videoDimensions
,
videoOrientation
,
viewShouldRotateContent
and
mirror
properties are reset to their respective default values.
Bug Fixes
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
UIView
APIs on a background thread while invalidating a
TVIVideoView
.
Features
framesEncoded
stats field to
TVILocalVideoTrackStats
.
trackId
from
TVIBaseTrackStats
.
trackSid
can be used to identify track stats in a
TVIStatsReport
.
trackId
from
TVILocalAudioTrack
,
TVILocalDataTrack
, and
TVILocalVideoTrack
.
trackSid
or
name
can be used to identify local tracks.
TVIRemoteAudioTrack.sid
,
TVIRemoteVideoTrack.sid
and
TVIRemoteDataTrack.sid
properties.
TVIAudioCodec
enumeration with
TVIAudioCodec
,
TVIG722Codec
,
TVIIsacCodec
,
TVIOpusCodec
,
TVIPcmaCodec
and
TVIPcmuCodec
classes.
TVIVideoCodec
enumeration with
TVIH264Codec
,
TVIVp8Codec
and
TVIVp9Codec
classes.
Improvements
Bug Fixes
[TVIRoomDelegate room\:didDisconnectWithError:]
was not raised for connected Participants when a Room is completed via the REST API.
[TVIRoom hash]
could change between the time a
TVIRoom
object is created and when it connects. This issue could cause issues when the
TVIRoom
object was stored in a collection.
TVIRoom
in bad network conditions.
[TVIRoomDelegate room\:didDisconnectWithError:]
was not getting invoked due to a race condition between a network handover and a user initiated
[TVIRoom disconnect]
call.
#235
turns
scheme are now supported. The SDK will now use
turns
by default if turn is enabled for your Room.
stuns
scheme are now supported.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
Enhancements
TVIAudioSessionActivated()
and
TVIAudioSessionDeactivated()
to support backgrounding for custom
TVIAudioDevice
s. [ISDK-1842]
reconnectAfterReturningToForeground
property from
TVIConnectOptions
and
TVIConnectOptionsBuilder
. The SDK will continue to support the default behavior of terminating signaling connections when AVAudioSession is inactive and the app is backgrounded.
Bug Fixes
TVIDefaultAudioDevice
was not able to play or record audio if the user joins a Room with a bluetooth device.
#236
TVIAudioDevice
which could occur while invoking
TVIAudioDeviceFormatChanged()
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
Enhancements
TVIAudioDeviceExecuteWorkerBlock
executes the supplied block asynchronously.
Bug Fixes
TVIAudioDeviceFormatChanged
and
TVIAudioDeviceExecuteWorkerBlock
. It should no longer be possible for these functions to access an invalid
TVIAudioDeviceContext
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIDefaultAudioDevice
is not able to play or record audio if the user joins a Room with a bluetooth device.
#236
TVIDefaultAudioDevice
is used in a Room. [ISDK-1842]
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
This release is focused on enabling more advanced audio use cases in Twilio Video. In the past you've been able to use TVIAudioSink
to access raw audio samples from a TVIAudioTrack
. However, these APIs did not allow developers to control the mechanism by which audio is captured and rendered in a Room.
We're now pleased to introduce TVIAudioDevice
. This protocol works in concert with TVIAudioSink
, giving you the ability to replace TVIDefaultAudioDevice
. By implementing the TVIAudioDevice
protocol, you can write your own audio capturer to feed audio samples to the Video SDK and an audio renderer to receive the remote Participant's audio samples. For example, you could integrate with ReplayKit2
and capture application audio for broadcast or play music using AVAssetReader
.
See AudioDeviceExample which uses a custom Audio Device with CoreAudio to play the remote Participant's stereo audio. In the future, we will add more AudioDevices to the repo.
Please note, if you are providing your own custom audio device, it is necessary to support audio capturing in order to create an instance of TVILocalAudioTrack
. Also, if the supplied audio device does not support audio rendering then the you will not be able to receive any audio samples via TVIAudioSink
.
Enhancements
TVIAudioDevice
protocol. As a part of this change we've also added
TVIAudioFormat
which describes audio that is being captured and rendered.
TwilioVideo.audioDevice
class property, and removed
TVIConnectOptions.audioDevice
. You should set your audio device on
TwilioVideo
before performing any other actions with the SDK such as creating Tracks or connecting to a Room.
TVILocalAudioTrack
and
TVILocalDataTrack
now return
nullable
instances.
Bug Fixes
TVIDefaultAudioDevice
is not able to play or record audio after an
AVAudioSessionInterruptionNotification
is triggered.
#221
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIDefaultAudioDevice
is not able to play or record audio if the user joins a Room with a bluetooth device.
#236
TVIDefaultAudioDevice
is used in a Room. [ISDK-1842]
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
Enhancements
Bug Fixes
[TVIRoomDelegate room\:didFailToConnectWithError:]
,
[TVIRoomDelegate roomDidStartRecording:]
and
[TVIRoomDelegate roomDidStopRecording:]
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIDefaultAudioDevice
is not able to play or record audio if the user joins a Room with a bluetooth device.
#236
TVIDefaultAudioDevice
is not able to play or record audio after an
AVAudioSessionInterruptionNotification
is triggered.
#221
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
As of this release we are removing support for iOS 8 and raising our minimum target to iOS 9.0. Twilio Video 1.x releases will continue to support iOS 8.1 and later.
Enhancements
[TVICameraCapturerDelegate cameraCapturerWasInterrupted:reason:]
now uses
AVCaptureSessionInterruptionReason
instead of
TVICameraCapturerInterruptionReason
.
TVIRemoteParticipantDelegate
.
failedToSubscribeToAudioTrack:error:forParticipant:
failedToSubscribeToDataTrack:error:forParticipant:
failedToSubscribeToVideoTrack:error:forParticipant:
TVIAudioController
and adds a new
TVIDefaultAudioDevice
class. The
TVIDefaultAudioDevice
class allows you to record and playback audio and allows to configure
AVAudioSession
when you are connected to a Room.
TVIAudioController.startAudio()
and
TVIAudioController.stopAudio()
have been removed in favor of a new property called
TVIDefaultAudioDevice.enabled
. This property provides developers with a mechanism to enable or disable the activation of the audio device prior to connecting to a Room or to stop or start the audio device while you are already connected to a Room. A Room can now be connected without activating the audio device by setting
TVIDefaultAudioDevice.enabled
to
NO
and can be enabled during the lifecycle of the Room by setting
TVIDefaultAudioDevice.enabled
to
YES
. The default value is
YES
. This API change was made to ensure full compatibility with CallKit as well as supporting other use cases where developers may need to disable the audio device during a call.
TVIDefaultAudioDevice
can be provided to
TVIConnectOptions
while connecting to a Room.
TVIRoom
has a new property
audioDevice
which points to the audio device used by the Room.
Examples #1 - Changing the audio route from speaker to receiver in a live call:
_20TVIDefaultAudioDevice *audioDevice = [TVIDefaultAudioDevice audioDevice];_20_20//...connect to a Room with audioDevice. By default the audio route will be configured to speaker._20_20room.audioDevice.block = ^ {_20 // We will execute `kDefaultAVAudioSessionConfigurationBlock` first._20 kDefaultAVAudioSessionConfigurationBlock();_20_20 // Overwrite the audio route_20 AVAudioSession *session = [AVAudioSession sharedInstance];_20 NSError *error = nil;_20 if (![session setMode:AVAudioSessionModeVoiceChat error:&error]) {_20 NSLog(@"AVAudiosession setMode %@",error);_20 }_20_20 if (![session overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error]) {_20 NSLog(@"AVAudiosession overrideOutputAudioPort %@",error);_20 }_20};_20room.audioDevice.block();
Example #2 - Connecting to a Room using the AVAudioSessionCategoryPlayback
category:
_22TVIDefaultAudioDevice *audioDevice = [TVIDefaultAudioDevice audioDeviceWithBlock:^ {_22_22 // Execute the `kDefaultAVAudioSessionConfigurationBlock` first._22 kDefaultAVAudioSessionConfigurationBlock();_22_22 // Overwrite the category to `playback`_22 AVAudioSession *session = [AVAudioSession sharedInstance];_22 NSError *error = nil;_22 if (![session setCategory:AVAudioSessionCategoryPlayback_22 mode:AVAudioSessionModeVideoChat_22 options:AVAudioSessionCategoryOptionAllowBluetooth_22 error:&error]) {_22 NSLog(@"AVAudioSession setCategory:options:mode:error: %@",error);_22 }_22}];_22_22TVIConnectOptions *connectOptions = [TVIConnectOptions optionsWithToken:token_22 block:^(TVIConnectOptionsBuilder *builder) {_22 builder.audioDevice = audioDevice;_22 }];_22_22TVIRoom *room = [TwilioVideo connectWithOptions: connectOptions]
TVIIceCandidatePairStats
activeCandidatePair
- indicates if the candidate pair is active.
localCandidateIp
- the IP address of the local candidate associated with this candidate pair.
remoteCandidateIp
- the IP address of the remote candidate associated with this candidate pair.
relayProtocol
- the relay protocol
Bug Fixes
TVICameraCapturer.init()
is now annotated as
null_unspecified
instead of inheriting from
NSObject.init()
to match other initializers. [ISDK-1728]
TVIRemoteParticipantDelegate
callbacks could be missed leading to
[TVIRemoteParticipant unsubscribedFrom*Track:publication:forParticipant:]
events raised when the underlying C++ core track is
nullptr
.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIDefaultAudioDevice
is not able to play or record audio if the user joins a Room with a bluetooth device.
#236
TVIDefaultAudioDevice
is not able to play or record audio after an
AVAudioSessionInterruptionNotification
is triggered.
#221
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
Enhancements
TwilioVideo.framework
is now built with Xcode 9.1.
Bug Fixes
TVIAudioSink
now pre-allocates buffers used on a real-time CoreAudio thread.
#104
[ISDK-1412]
name
parameter has been removed from the
TVILocalDataTrack trackWithOptions:name:
method. Track names can now be provided in the
TVIDataTrackOptions
object. [ISDK-1708]
TVITrackPublication
s
track
property now returns
nil
from within the
unsubscribedFrom*Track:publication:forParticipant:
callback invocation. [ISDK-1710]
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
Features
TVILocalParticipantDelegate
. [ISDK-1625]
localParticipant:failedToPublishAudioTrack:withError:
localParticipant:failedToPublishDataTrack:withError:
localParticipant:failedToPublishVideoTrack:withError:
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
TVIAudioSink
should pre-allocate buffers used on a real-time CoreAudio thread.
#104
[ISDK-1412]
Features
TVIDataTrack
API. A data track represents a unidirectional source that allows sharing
string and binary data with all Participants in a Room. Data tracks function similarly to audio and
video tracks and can be provided via
TVIConnectOptions
and published using
[TVILocalParticipant publishDataTrack:]
. Messages sent on the data track are not guaranteed to be
delivered to all the Participants. Data tracks are currently supported in Peer-to-Peer Rooms only.
The following snippets demonstrate how to send and receive messages with data tracks.
Creating a TVILocalDataTrack
_10TVILocalDataTrack *localDataTrack = [TVILocalDataTrack track];
Connecting to a Room
with a TVILocalDataTrack
_10TVIConnectOptions *connectOptions = [TVIConnectOptions optionsWithToken:accessToken_10 block:^(TVIConnectOptionsBuilder *builder) {_10 builder.dataTracks = @[localDataTrack];_10 }];_10_10TVIRoom *room = [TwilioVideo connectWithOptions:connectOptions delegate:self];
Publishing a TVILocalDataTrack
_10// ... Connected to room_10TVILocalParticipant *localParticipant = room.localParticipant;_10_10[localParticipant publishDataTrack:dataTrack];
Observing TVIRemoteDataTrackPublication
and TVIRemoteDataTrack
on TVIRemoteParticipantDelegate
_21@interface MyClass : NSObject <TVIRemoteParticipantDelegate>_21_21// Participant has published data track_21- (void)remoteParticipant:(nonnull TVIRemoteParticipant *)participant_21 publishedDataTrack:(nonnull TVIRemoteDataTrackPublication *)publication;_21_21_21// Participant has unpublished data track_21- (void)remoteParticipant:(nonnull TVIRemoteParticipant *)participant_21 unpublishedDataTrack:(nonnull TVIRemoteDataTrackPublication *)publication;_21_21// Data track has been subscribed to and messages can be observed._21- (void)subscribedToDataTrack:(nonnull TVIRemoteDataTrack *)dataTrack_21 publication:(nonnull TVIRemoteDataTrackPublication *)publication_21 forParticipant:(nonnull TVIRemoteParticipant *)participant;_21_21// Data track has been unsubsubscribed from and messages cannot be observed._21- (void)unsubscribedFromDataTrack:(nonnull TVIRemoteDataTrack *)dataTrack_21 publication:(nonnull TVIRemoteDataTrackPublication *)publication_21 forParticipant:(nonnull TVIRemoteParticipant *)participant;_21@end
Sending messages on TVILocalDataTrack
_10NSString *message = @"Hello DataTrack!";_10[localDataTrack sendString:message];_10_10NSData *messageBuffer = [NSData dataWithBytes:bytes length:length];_10[localDataTrack sendData:messageBuffer];
Observing messages from data track
_10@interface MyClass : NSObject <TVIRemoteDataTrackDelegate>_10_10- (void)remoteDataTrack:(nonnull TVIRemoteDataTrack *)remoteDataTrack didReceiveString:(nonnull NSString *)message;_10_10- (void)remoteDataTrack:(nonnull TVIRemoteDataTrack *)remoteDataTrack didReceiveData:(nonnull NSData *)message;_10_10@end
Bug Fixes
TVIAudioSink
s added to a
TVILocalAudioTrack
now raise callbacks. Audio recording does not start until you join an empty Group Room or a Peer-to-Peer Room with one or more Participants.
#104
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
TVIAudioSink
should pre-allocate buffers used on a real-time CoreAudio thread.
#104
[ISDK-1412]
Features
trackSid
property to
TVIBaseTrackStats
.
trackId
,
ssrc
and
codec
properties in
TVIBaseTrackStats
are now annotated as
nonnull
.
Bug Fixes
TVIAudioCodecPCMU
,
TVIAudioCodecPCMA
and
TVIAudioCodecG722
operate at 64 kbps. Setting a maximum bitrate for these codecs no longer results in a loss of audio and video.
TVIAudioCodecISAC
no longer results in a crash.
Known Issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
TVIAudioSink
s added to a
TVILocalAudioTrack
do not raise any callbacks.
#104
Bug fixes
VTDecompressionSessionInvalidate
which could occur on iOS 11.0 when receiving H.264 video. [ISDK-1502]
Known issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
TVIAudioSink
s added to a
TVILocalAudioTrack
do not raise any callbacks.
#104
TVIAudioCodecPCMU
,
TVIAudioCodecPCMA
and
TVIAudioCodecG722
operate at 64 kbps. Setting a maximum bitrate for these codecs results in a loss of audio and video.
TVIAudioCodecISAC
results in a crash.
Bug fixes
Known issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
TVIAudioSink
s added to a
TVILocalAudioTrack
do not raise any callbacks.
#104
TVIAudioCodecPCMU
,
TVIAudioCodecPCMA
and
TVIAudioCodecG722
operate at 64 kbps. Setting a maximum bitrate for these codecs results in a loss of audio and video.
TVIAudioCodecISAC
results in a crash.
Our first 2.0 preview release delivers several important features including:
The full list of changes is:
TVIRemoteAudioTrack
and TVIRemoteVideoTrack
. These new classes are derived from TVIAudioTrack
and TVIVideoTrack
respectively. They have following common properties:
sid
- Returns a unique identifier for the Track within the scope of a
Room
isSubscribed
- Indicates if the
TVILocalParticipant
is receiving audio or video.
playbackEnabled
property to
TVIRemoteAudioTrack
which allows developers to mute the audio received from a remote Participant.
TVIParticipant
into a new class called
TVIRemoteParticipant
.
TVILocalParticipant
and
TVIRemoteParticipant
are now derived from
TVIParticipant
.
TVIParticipantDelegate
to
TVIRemoteParticipantDelegate
and changed the delegate to return
TVIRemoteParticipant
,
TVIRemoteAudioTrack
, and
TVIRemoteVideoTrack
in callbacks.
TVIRemoteParticipantDelegate
:
subscribedToAudioTrack:forParticipant:
- Audio will start flowing from a remote Participant's audio Track after receiving this event.
unsubscribedFromAudioTrack:forParticipant:
- Audio will stop flowing from a remote Participant's audio Track after receiving this event.
subscribedToVideoTrack:forParticipant:
- Video will start flowing from a remote Participant's video Track after receiving this event.
unsubscribedFromVideoTrack:forParticipant:
- Video will stop flowing from a remote Participant's video Track after receiving this event.
TVITrackStats
to
TVIRemoteTrackStats
,
TVIAudioTrackStats
to
TVIRemoteAudioTrackStats
and
TVIVideoTrackStats
to
TVIRemoteVideoTrackStats
TVITrackPublication
,
TVIAudioTrackPublication
and
TVIVideoTrackPublication
which represent the mapping between a Track and its server generated
sid
.
audioTracks
and
videoTracks
getters on
TVIParticipant
now return
TVITrackPublication
s instead of
TVITrack
s.
TVILocalAudioTrackPublication
and
TVILocalVideoTrackPublication
to represent a published
TVILocalAudioTrack
and
TVILocalVideoTrack
. Track publication classes are derived from
TVIAudioTrackPublication
and
TVIVideoTrackPublication
respectively.
[TVILocalParticipant addAudioTrack:]
and
[TVILocalParticipant addVideoTrack:]
to
[TVILocalParticipant publishAudioTrack:]
and
[TVILocalParticipant publishVideoTrack:]
.
TVILocalParticipantDelegate
which provides the following callbacks:
localParticipant:publishedAudioTrack:
- Invoked when a local audio Track has been published to a Room.
localParticipant:publishedVideoTrack:
- Invoked when a local video Track has been published to a Room.
localAudioTracks
and
localVideoTracks
collections to
TVILocalParticipant
. These collections return
TVILocalAudioTrackPublication
s and
TVILocalVideoTrackPublication
s respectively.
name
property to
TVITrack
. Names can be assigned to a
TVILocalAudioTrack
and
TVILocalVideoTrack
using their class factory methods.
trackId
property from
TVITrack
and moved it into
TVILocalAudioTrack
and
TVILocalVideoTrack
.
TVIAudioCodec
and
TVIVideoCodec
as part of the new codec preferences API. Audio and video codec preferences can be set in
TVIConnectOptions
.
TVIRemoteAudioTrackPublication
and
TVIRemoteVideoTrackPublication
to represent a remote Participant's published audio and video Tracks. Track publication classes are derived from
TVIAudioTrackPublication
and
TVIVideoTrackPublication
respectively.
TVIEncodingParameters
which constrains how much bandwidth is used to share audio and video. This object has been added to
TVIConnectOptions
and can also be set on
TVILocalParticipant
after joining a Room.
Bug fixes
[TVIRoom disconnect:]
before
[TVIRoomDelegate didConnectToRoom:]
is called and then destroying the
TVIRoom
in the
[TVIRoomDelegate room\:didDisconnectWithError:]
callback.
Known issues
TVILocalAudioTrack
or
TVILocalVideoTrack
might not be seen by Participants.
#34
TVIPixelFormatYUV420PlanarFullRange
or
TVIPixelFormatYUV420PlanarVideoRange
. [ISDK-1489]
TVIAudioSink
s added to a
TVILocalAudioTrack
do not raise any callbacks.
#104
TVIAudioCodecPCMU
,
TVIAudioCodecPCMA
and
TVIAudioCodecG722
operate at 64 kbps. Setting a maximum bitrate for these codecs results in a loss of audio and video.
TVIAudioCodecISAC
results in a crash.