iOS Swift: come ottenere le proporzioni dei video locali e remoti?


12

Scenario: sto creando una vista WebRTC all'interno di un'app Il contenitore per i video avrà sempre un'altezza di 160.

Al centro del contenitore dovrebbe essere visualizzato il video remoto con un'altezza massima di 160, la larghezza deve essere ridimensionata per rispettare le proporzioni del video. Inoltre, la larghezza non può essere maggiore della larghezza della vista, in tal caso la larghezza sarà uguale alla larghezza della vista e l'altezza dovrebbe essere adattata alle proporzioni.

Nell'angolo in alto a destra dovrebbe essere visualizzato il video locale dalla fotocamera anteriore con una larghezza massima di 100 e l'altezza deve essere adattata per rispettare le proporzioni del video locale

il mio codice finora:

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!)
        }
    }
}

Non so come ottenere le proporzioni di nessuno dei video, locale o remoto. Se lo avessi, avrei potuto calcolare la larghezza e le altezze appropriate per ciascuno di essi


Penso che questa soluzione aiuterà il tuo problema < stackoverflow.com/questions/10433774/… >
Darshan sk,

Risposte:


4

È possibile utilizzare AVURLAssete CGSizeper ottenere la risoluzione per il 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))
} 

Ora, usa natural sizeepreferredTransform

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)
}

Inoltre, puoi trovare il fattore di scala

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;

Questo può essere ottenuto anche con GPUImageMovie, GPUImageCropFiltereGPUImageMovieWriter


non ho un URL. ho una sorgente video e RTCVideoTrack dalla mia webcam e una traccia video remota che è RTCVideoTrack
John,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.