iOS Swift - comment obtenir le rapport d'aspect de la vidéo locale et distante?

12

Scénario: Je crée une vue WebRTC dans une application Le conteneur de vidéos aura toujours une hauteur de 160.

Au centre du conteneur, la vidéo à distance doit être affichée avec une hauteur maximale de 160, la largeur doit être mise à l'échelle pour respecter le rapport d'aspect de la vidéo. La largeur ne peut pas non plus être supérieure à la largeur de la vue, dans ce cas, la largeur sera égale à la largeur de la vue et la hauteur doit être adaptée au rapport d'aspect.

Dans le coin supérieur droit, la vidéo locale de la caméra frontale doit être affichée avec une largeur maximale de 100 et la hauteur doit être adaptée pour respecter le rapport d'aspect de la vidéo locale

mon code jusqu'à présent:

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

Je ne sais pas comment obtenir le rapport d'aspect des vidéos, locales ou distantes. Si j'avais cela, je pourrais calculer la largeur et la hauteur appropriées pour chacun d'eux

John
la source
Je pense que cette solution va aider votre problème < stackoverflow.com/questions/10433774/… >
Darshan sk

Réponses:

4

Vous pouvez utiliser le AVURLAssetet CGSizepour obtenir la résolution de la vidéo

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

Maintenant, utilisez natural sizeetpreferredTransform

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

Vous pouvez également trouver le facteur d'échelle

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;

Cela peut également être réalisé par GPUImageMovie, GPUImageCropFilteretGPUImageMovieWriter

Sreeram Nair
la source
je n'ai pas d'URL. j'ai la source vidéo et RTCVideoTrack de ma webcam et videoTrack à distance qui est RTCVideoTrack
John