iOS Swift - yerel ve uzak videonun en boy oranını nasıl alabilirim?


12

Senaryo: Bir uygulamanın içinde WebRTC görünümü oluşturuyorum Videolar için kapsayıcı her zaman 160 yüksekliğe sahip olacak.

Kabın ortasında maksimum 160 yüksekliğe sahip uzak video gösterilmeli, videonun en boy oranına göre genişlik ölçeklendirilmelidir. Genişlik de görünüm genişliğinden daha büyük olamaz, bu durumda genişlik görünüm genişliğine eşit olur ve yükseklik en boy oranına uyarlanmalıdır.

Sağ üst köşede ön kameradan maksimum 100 genişliğe sahip yerel video görüntülenmeli ve yükseklik yerel videonun en boy oranına göre uyarlanmalıdır

şimdiye kadar benim kod:

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

Yerel veya uzak videoların en boy oranını nasıl alacağımı bilmiyorum. Eğer olsaydım, her biri için uygun genişlik ve yükseklikleri hesaplayabilirdim


Bu çözümün sorununuzu
Darshan sk

Yanıtlar:


4

Video çözünürlüğünü almak için AVURLAssetve öğelerini kullanabilirsiniz.CGSize

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

Şimdi, Kullanın natural sizevepreferredTransform

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

Ayrıca ölçek faktörünü de bulabilirsiniz.

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;

Bu aynı zamanda, elde edilebilir GPUImageMovie, GPUImageCropFilterveGPUImageMovieWriter


URL'm yok. benim web kamerası ve RTCVideoTrack olan uzaktan videoTrack video kaynağı ve RTCVideoTrack var
John
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.