【发布时间】:2020-04-10 08:11:54
【问题描述】:
场景: 我正在应用程序中构建 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!)
}
}
}
我不知道如何获取本地或远程视频的纵横比。如果我有这个,我可以为每个人计算适当的宽度和高度
// 使用解决方案编辑:
我没有找到获得确切尺寸的方法,但我找到了一种按比例渲染视频的方法 我所要做的就是:
let videoView = RTCEAGLVideoView(frame: CGRect(x: self.view.frame.size.width - 105, y: 5, width: 100, height: 134))
videoView.contentMode = .scaleAspectFill
现在视频会根据容器大小自行缩放
【问题讨论】:
-
我认为这个解决方案会帮助你解决问题stackoverflow.com/questions/10433774/…>
-
@john 你找到解决方案了吗?
-
@iosdev1111 我用我找到的解决方案更新了我的问题