Skip to main content
Delegate protocol for receiving track events such as dimension updates and statistics.

Usage

class MyViewController: UIViewController, TrackDelegate {
    func setupTrack(_ track: Track) {
        track.add(delegate: self)
    }
    
    func track(_ track: VideoTrack, didUpdateDimensions dimensions: Dimensions?) {
        print("Video dimensions updated: \(dimensions)")
    }
}

Methods

track(_:didUpdateDimensions:)
optional
Dimensions of a video track have updated.Only called for video tracks.
func track(_ track: VideoTrack, didUpdateDimensions dimensions: Dimensions?)
Parameters:
  • track: The video track whose dimensions changed
  • dimensions: The new dimensions, or nil if dimensions are unknown
track(_:didUpdateStatistics:simulcastStatistics:)
optional
Statistics for the track have been generated.This provides detailed performance metrics for the track.
func track(_ track: Track, didUpdateStatistics: TrackStatistics, simulcastStatistics: [VideoCodec: TrackStatistics])
Parameters:
  • track: The track for which statistics were generated
  • didUpdateStatistics: The main track statistics
  • simulcastStatistics: Statistics for each simulcast layer, keyed by codec

Example

class VideoViewController: UIViewController, TrackDelegate {
    var videoView: VideoView!
    
    func handleRemoteTrack(_ track: RemoteVideoTrack) {
        track.add(delegate: self)
        track.add(videoRenderer: videoView)
    }
    
    // TrackDelegate methods
    
    func track(_ track: VideoTrack, didUpdateDimensions dimensions: Dimensions?) {
        guard let dimensions = dimensions else { return }
        
        DispatchQueue.main.async {
            // Update video view aspect ratio
            let aspectRatio = CGFloat(dimensions.width) / CGFloat(dimensions.height)
            self.videoView.updateAspectRatio(aspectRatio)
        }
    }
    
    func track(_ track: Track, didUpdateStatistics statistics: TrackStatistics, simulcastStatistics: [VideoCodec: TrackStatistics]) {
        print("Track \(track.sid?.stringValue ?? "unknown"):")
        print("  Bitrate: \(statistics.bitrate) bps")
        print("  Packet loss: \(statistics.packetsLost)")
        
        for (codec, stats) in simulcastStatistics {
            print("  \(codec): \(stats.bitrate) bps")
        }
    }
}

Build docs developers (and LLMs) love