iOS स्विफ्ट - स्थानीय और दूरस्थ वीडियो का पहलू अनुपात कैसे प्राप्त करें?


12

परिदृश्य: मैं एक ऐप के अंदर एक WebRTC दृश्य बना रहा हूं वीडियो के लिए कंटेनर में हमेशा 160 की ऊंचाई होगी।

कंटेनर के केंद्र में 160 की अधिकतम ऊंचाई के साथ दूरस्थ वीडियो प्रदर्शित किया जाना चाहिए, वीडियो के पहलू अनुपात का सम्मान करने के लिए चौड़ाई को बढ़ाया जाना चाहिए। चौड़ाई भी दृश्य चौड़ाई से बड़ी नहीं हो सकती है, उस स्थिति में चौड़ाई देखने की चौड़ाई के बराबर होगी और ऊंचाई को पहलू अनुपात के अनुकूल बनाया जाना चाहिए।

शीर्ष दाएं कोने में फ्रंट कैमरे से 100 की अधिकतम चौड़ाई के साथ स्थानीय वीडियो प्रदर्शित किया जाना चाहिए और स्थानीय वीडियो के पहलू अनुपात का सम्मान करने के लिए ऊंचाई को अनुकूलित किया जाना चाहिए

मेरा कोड अब तक:

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

मुझे नहीं पता कि वीडियो, स्थानीय या रिमोट दोनों में से किस तरह का पहलू अनुपात प्राप्त करना है। अगर मेरे पास ऐसा था, तो मैं उनमें से प्रत्येक के लिए उपयुक्त चौड़ाई और ऊंचाइयों की गणना कर सकता था


मुझे लगता है कि यह समाधान आपकी समस्या को हल करने में मदद करेगा < stackoverflow.com/questions/10433774/… >
दर्शन sk

जवाबों:


4

आप उपयोग कर सकते हैं AVURLAssetऔर 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))
} 

अब, का उपयोग करें natural sizeऔरpreferredTransform

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

इसके अलावा, आप स्केल फैक्टर पा सकते हैं

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;

यह भी द्वारा प्राप्त किया जा सकता है GPUImageMovie, GPUImageCropFilterऔरGPUImageMovieWriter


मेरे पास URL नहीं है। मेरे पास मेरे वेबकैम से वीडियो स्रोत और RTCVideoTrack है और रिमोट वीडियोट्रैक जो RTCVideoTrack है
John
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.