Escenario: estoy construyendo una vista WebRTC dentro de una aplicación El contenedor para videos siempre tendrá una altura de 160.
En el centro del contenedor debe mostrarse el video remoto con una altura máxima de 160, el ancho debe ajustarse para respetar la relación de aspecto del video. El ancho tampoco puede ser mayor que el ancho de la vista, en ese caso el ancho será igual al ancho de la vista y la altura debe adaptarse a la relación de aspecto.
En la esquina superior derecha, debe mostrarse el video local de la cámara frontal con un ancho máximo de 100 y la altura debe adaptarse para respetar la relación de aspecto del video local
mi código hasta ahora:
func createPeerConnection () {
    // some other code
    self.localStream = self.factory.mediaStream(withStreamId: "stream")
    let videoSource = self.factory.videoSource()
    let devices = RTCCameraVideoCapturer.captureDevices()
    if let camera = devices.last,
        let format = RTCCameraVideoCapturer.supportedFormats(for: camera).last,
        let fps = format.videoSupportedFrameRateRanges.first?.maxFrameRate {
        let intFps = Int(fps)
        self.capturer = RTCCameraVideoCapturer(delegate: videoSource)
        self.capturer?.startCapture(with: camera, format: format, fps: intFps)
        videoSource.adaptOutputFormat(toWidth: 100, height: 160, fps: Int32(fps))
    }
    let videoTrack = self.factory.videoTrack(with: videoSource, trackId: "video")
    self.localStream.addVideoTrack(videoTrack)
    DispatchQueue.main.async {
        if self.localView == nil {
            let videoView = RTCEAGLVideoView(frame: CGRect(x: self.view.frame.size.width - 105, y: 5, width: 100, height: 160))
            videoView.backgroundColor = UIColor.red
            self.view.addSubview(videoView)
            self.localView = videoView
        }
        videoTrack.add(self.localView!)
    }
}
func peerConnection(_ peerConnection: RTCPeerConnection, didAdd stream: RTCMediaStream) {
    self.remoteStream = stream
    if let videoTrack = stream.videoTracks.first {
        DispatchQueue.main.async {
            if self.remoteView == nil {
                let videoView = RTCEAGLVideoView(frame: CGRect(x: self.view.frame.size.width - 50, y: 0, width: 100, height: 160))
                videoView.backgroundColor = UIColor.green
                if let local = self.localView {
                    self.view.insertSubview(videoView, belowSubview: local)
                } else {
                    self.view.addSubview(videoView)
                }
                self.remoteView = videoView
            }
            videoTrack.add(self.remoteView!)
        }
    }
}No sé cómo obtener la relación de aspecto de ninguno de los videos, local o remoto. Si tuviera eso, podría calcular el ancho y la altura apropiados para cada uno de ellos.

Respuestas:
Puede usar
AVURLAssetyCGSizepara obtener la resolución del videoAhora, use
natural sizeypreferredTransformAdemás, puedes encontrar el factor de escala
Esto también se puede lograr con
GPUImageMovie,GPUImageCropFilteryGPUImageMovieWriterfuente