iOS Swift: ¿cómo obtener la relación de aspecto del video local y remoto?

12

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.

Juan
fuente
Creo que esta solución ayudará a su problema < stackoverflow.com/questions/10433774/… >
Darshan sk

Respuestas:

4

Puede usar AVURLAssety CGSizepara obtener la resolución del video

private func resolutionForLocalVideo(url: URL) -> CGSize? {
   guard let track = AVURLAsset(url: url).tracks(withMediaType: AVMediaTypeVideo).first else { return nil }
   let size = track.naturalSize.applying(track.preferredTransform)
   return CGSize(width: fabs(size.width), height: fabs(size.height))
} 

Ahora, use natural sizeypreferredTransform

var mediaAspectRatio: Double! // <- here the aspect ratio for video with url will be set

func initAspectRatioOfVideo(with fileURL: URL) {
  let resolution = resolutionForLocalVideo(url: fileURL)

  guard let width = resolution?.width, let height = resolution?.height else { 
     return 
  }

  mediaAspectRatio = Double(height / width)
}

Además, puedes encontrar el factor de escala

float xScale = destination.size.width / imageSize.width; //destination is the max image drawing area.

float yScale = destination.size.height / imageSize.height;

float scaleFactor = xScale < yScale ? xScale : yScale;

Esto también se puede lograr con GPUImageMovie, GPUImageCropFilteryGPUImageMovieWriter

Sreeram Nair
fuente
No tengo una URL. Tengo fuente de video y RTCVideoTrack desde mi cámara web y videoTrack remoto que es RTCVideoTrack
John