Исправьте размер удаленного видео на iPhoneX во время видеозвонка с помощью webrtc iOS swift - PullRequest
4 голосов
/ 24 июня 2019

Я использую webRTC для видеозвонков. Все работает гладко, но Я борюсь с соотношением сторон удаленного видео на iPhoneX, XSMax. Я вижу много увеличения в видео. Можете ли вы помочь мне, как я могу управлять удаленным видео на устройствах с надрезом. Ниже приведен код, где я обрабатываю удаленный размер.

func videoView(_ videoView: RTCEAGLVideoView, didChangeVideoSize size: CGSize) {
    print(size)

    let defaultAspectRatio: CGSize = CGSize(width: 4, height: 3)
    let aspectRatio: CGSize = size.equalTo(CGSize.zero) ? defaultAspectRatio : size
    let videoRect: CGRect = self.view.bounds
    let maxFloat = CGFloat.maximum(self.view.frame.width, self.view.frame.height)
    let newAspectRatio = aspectRatio.width / aspectRatio.height
    var frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)
    if (aspectRatio.width < aspectRatio.height) {
        frame.size.width = maxFloat;
        frame.size.height = frame.size.width / newAspectRatio;
    } else {
        frame.size.height = maxFloat;
        frame.size.width = frame.size.height * newAspectRatio;
    }
    frame.origin.x = (self.view.frame.width - frame.size.width) / 2
    frame.origin.y = (self.view.frame.height - frame.size.height) / 2

self.remoteView.frame = frame

}

1 Ответ

0 голосов
/ 29 июня 2019

Вы можете создать некоторый класс с шоу-видео -

class SomeVideoView: UIView, RTCVideoViewDelegate {
    let videoView = RTCEAGLVideoView(frame: .zero)
    var videoSize = CGSize.zero

С методом инициализации

override init(frame: CGRect) {
    super.init(frame: frame)
    videoView.delegate = self
    self.addSubview(videoView)
   ...

Обрабатывать метод делегата videoView:didChangeVideoSize вот так (нам не нужно менять кадр вПользовательский интерфейс, нужно только пометить метку)

func videoView(_ videoView: RTCEAGLVideoView, didChangeVideoSize size: CGSize) {
    if (self.videoView == videoView) {
        self.videoSize = size
    }
    self.setNeedsLayout()
}

И перезаписать layoutSubviews метод

override func layoutSubviews() {
    if (self.videoSize.width > 0 && self.videoSize.height > 0) {
        var videoFrame = AVMakeRect(aspectRatio: self.videoSize, insideRect: bounds)
        var scale = 1.0
        if (videoFrame.size.width > videoFrame.size.height) {
            scale = bounds.size.height / videoFrame.size.height
        } else {
            scale = bounds.size.width / videoFrame.size.width
        }
        videoFrame.size.width = videoFrame.size.width * scale
        videoFrame.size.height = videoFrame.size.height * scale
        self.videoView.frame = videoFrame
        self.videoView.center = CGPointMake(bounds.midX, bounds.midY)
    } else {
        self.videoView.frame = bounds
    }

    ...
}

И настроить SomeVideoView в полноэкранном режиме (по этой ссылке можно помочь)
Безопасный район Xcode 9

...