iOS Swift - làm thế nào để có được tỷ lệ khung hình của video cục bộ và từ xa?


12

Kịch bản: Tôi đang xây dựng chế độ xem WebRTC bên trong ứng dụng Hộp chứa video sẽ luôn có chiều cao 160.

Ở trung tâm của container nên được hiển thị video từ xa với chiều cao tối đa 160, chiều rộng phải được thu nhỏ để tôn trọng tỷ lệ khung hình của video. Chiều rộng cũng không thể lớn hơn chiều rộng của chế độ xem, trong trường hợp đó, chiều rộng sẽ bằng với chiều rộng của chế độ xem và chiều cao phải được điều chỉnh theo tỷ lệ khung hình.

Ở góc trên bên phải, sẽ được hiển thị video cục bộ từ camera trước với chiều rộng tối đa 100 và chiều cao phải được điều chỉnh để tôn trọng tỷ lệ khung hình của video cục bộ

mã của tôi cho đến nay:

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

Tôi không biết cách lấy tỷ lệ khung hình của một trong hai video, cục bộ hoặc từ xa. Nếu tôi có điều đó, tôi có thể tính chiều rộng và chiều cao phù hợp cho từng người trong số họ


Tôi nghĩ giải pháp này sẽ giúp ích cho vấn đề của bạn < stackoverflow.com/questions/10433774/ trên >
Darshan sk

Câu trả lời:


4

Bạn có thể sử dụng AVURLAssetCGSizeđể có được độ phân giải cho 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))
} 

Bây giờ, sử dụng natural sizepreferredTransform

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

Ngoài ra, bạn có thể tìm thấy các yếu tố quy mô

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;

Điều này cũng có thể đạt được bởi GPUImageMovie, GPUImageCropFilterGPUImageMovieWriter


Tôi không có URL. Tôi có nguồn video và RTCVideoTrack từ webcam và videoTrack từ xa là RTCVideoTrack
John
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.