iOS Swift - วิธีรับอัตราส่วนภาพของวิดีโอในตัวเครื่องและทางไกล


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/… >
Darshan 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.