iOS Swift - bagaimana cara mendapatkan rasio aspek video lokal dan jarak jauh?

12

Skenario: Saya sedang membangun tampilan WebRTC di dalam aplikasi. Kontainer untuk video akan selalu memiliki tinggi 160.

Di tengah wadah harus ditampilkan video jarak jauh dengan tinggi maksimal 160, lebar harus diskalakan untuk menghormati rasio aspek video. Lebar juga tidak boleh lebih besar dari lebar tampilan, dalam hal itu lebar akan sama dengan lebar tampilan dan tinggi harus disesuaikan dengan aspek rasio.

Di sudut kanan atas harus ditampilkan video lokal dari kamera depan dengan lebar maksimal 100 dan tinggi harus disesuaikan untuk menghormati aspek rasio video lokal

kode saya sejauh ini:

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

Saya tidak tahu cara mendapatkan rasio aspek dari video, lokal atau jarak jauh. Jika saya punya itu, saya bisa menghitung lebar dan ketinggian yang sesuai untuk masing-masing

John
sumber
Saya pikir solusi ini akan membantu masalah Anda < stackoverflow.com/questions/10433774/... >
Darshan sk

Jawaban:

4

Anda dapat menggunakan AVURLAssetdan CGSizeuntuk mendapatkan resolusi untuk 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))
} 

Sekarang, Gunakan natural sizedanpreferredTransform

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

Anda juga dapat menemukan faktor skala

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;

Ini juga dapat dicapai dengan GPUImageMovie, GPUImageCropFilterdanGPUImageMovieWriter

Sreeram Nair
sumber
saya tidak punya URL. saya punya sumber video dan RTCVideoTrack dari webcam saya dan videoTrack jarak jauh yaitu RTCVideoTrack
John