Swift 3、iOS 10+、xCode 8.3+、Quickblox - 在保持纵横比/视频分辨率的同时切换全屏远程流

Posted

技术标签:

【中文标题】Swift 3、iOS 10+、xCode 8.3+、Quickblox - 在保持纵横比/视频分辨率的同时切换全屏远程流【英文标题】:Swift 3, iOS 10+, xCode 8.3+, Quickblox - Toggle full screen remote stream while keeping aspect ratio/video res 【发布时间】:2017-05-31 14:25:17 【问题描述】:

我正在使用 webRTC 远程视频流并将远程会话附加到此:

@IBOutlet weak var remoteVideoElement: QBRTCRemoteVideoView!

我想要发生的是当用户点击上面的插座时,远程流会填满整个窗口。当用户再次点击它时,它将返回到它在布局中正常的位置。在大多数情况下,它工作正常,除了我无法保持远程视频流的正确纵横比或屏幕分辨率。有人可以帮我找出获得预期效果的正确方法吗?

这是我的代码:

var isExpanded = Bool()
var videoPlayerViewCenter = CGPoint()

override func viewDidLoad() 
        super.viewDidLoad()
        isExpanded = false

        let toggleFullScreen = UITapGestureRecognizer(target: self, action: #selector (self.toggleFullScreenRemoteVideo(sender:)))
        self.view.addGestureRecognizer(toggleFullScreen)


func toggleFullScreenRemoteVideo(sender: QBRTCRemoteVideoView) 
        if !isExpanded 
            // GO FULL SCREEN
            UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
                self.videoPlayerViewCenter = self.remoteVideoElement.center
                self.view.bringSubview(toFront: self.modalShadeBackground)
                self.view.bringSubview(toFront: self.remoteVideoElement)
                self.remoteVideoElement.frame = CGRect(x: 0, y: 0, width: self.view.frame.height, height: self.view.frame.width)
                self.remoteVideoElement.frame = AVMakeRect(aspectRatio: (self.remoteVideoElement.layer.preferredFrameSize()), insideRect: self.remoteVideoElement.frame)
                self.remoteVideoElement.contentMode = .scaleAspectFit
                self.remoteVideoElement.frame = UIScreen.main.bounds
                self.remoteVideoElement.center = self.view.center
                self.remoteVideoElement.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi / 2))
                self.remoteVideoElement.layoutSubviews()
            , completion: nil)
         else 
            // REVERT BACK TO ORIGINAL CONTRAINTS IN THE LAYOUT
            UIView.animate(withDuration: 0.8, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
                self.remoteVideoElement.transform = CGAffineTransform.identity
                self.remoteVideoElement.center = self.videoPlayerViewCenter
                self.view.sendSubview(toBack: self.remoteVideoElement)
                self.view.sendSubview(toBack: self.modalShadeBackground)
                self.remoteVideoElement.frame = AVMakeRect(aspectRatio: (self.remoteVideoElement.layer.preferredFrameSize()), insideRect: self.remoteVideoElement.frame)
                self.remoteVideoElement.layoutSubviews()
            , completion: nil)
        
        isExpanded = !isExpanded
    

【问题讨论】:

【参考方案1】:

我不确定QBRTCRemoteVideoView,但我用视频流解决了类似的问题 通过获取我的视频图像的比例并将其转换为我的视频视图的矩形。 基本上是这样的:

let xScale = maxImageDrawingArea.size.width / imageSize.width    
let yScale = maxImageDrawingArea.size.height / imageSize.height
let scaleFactor = xScale < yScale ? xScale : yScale;

然后通过

获取您的视图大小
let height = maxImageDrawingArea.size.height * scaleFactor
let width = maxImageDrawingArea.size.width * scaleFactor

然后使用此高度和宽度在您的案例 remoteVideoElement 中绘制您的视频支架

告诉我进展如何;

祝你好运,

【讨论】:

正在处理另一个问题将很快回复您。 直到今天我才明白这一点,因为防火墙出现了一个关键任务问题。我讨厌他们没有给你整整五十个。如果有什么我可以解决的,请告诉我。 你能在这里添加更多代码吗?具体来说,您至少可以投射 maxImageDrawingArea 和 imageSize 吗?那些应该是什么?你如何获得“我的视频图像的比例”??

以上是关于Swift 3、iOS 10+、xCode 8.3+、Quickblox - 在保持纵横比/视频分辨率的同时切换全屏远程流的主要内容,如果未能解决你的问题,请参考以下文章

Socket.IO 错误:zlib 没有这样的模块(Swift 3,Xcode 8.3)

我如何通过 swift 2.3 项目支持 iOS 版本 10.3

使用 Xcode 8.3 的通用框架?

Xcode 8.3 不支持 Swift 2.3 [关闭]

目标 C 项目中的 Xcode 8.3 Swift 版本错误 (SWIFT_VERSION)

Xcode 8.3 和 Swift 3:在 UICollectionView 中的单元格中显示图像,从 URL 获取并存储在 NSMutableArray