iOS Swift - 如何获取本地和远程视频的纵横比?

Posted

技术标签:

【中文标题】iOS Swift - 如何获取本地和远程视频的纵横比?【英文标题】:iOS Swift - how to get aspect ratio of local and remote video? 【发布时间】: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

现在视频会根据容器大小自行缩放

【问题讨论】:

我认为这个解决方案会帮助你解决问题***.com/questions/10433774/…> @john 你找到解决方案了吗? @iosdev1111 我用我找到的解决方案更新了我的问题 【参考方案1】:

您可以使用AVURLAssetCGSize 来获取视频的分辨率

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

现在,使用 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)

另外,你可以找到比例因子

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;

这也可以通过GPUImageMovieGPUImageCropFilterGPUImageMovieWriter实现

【讨论】:

我没有网址。我有来自我的网络摄像头和远程 videoTrack 的视频源和 RTCVideoTrack,即 RTCVideoTrack

以上是关于iOS Swift - 如何获取本地和远程视频的纵横比?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10 带图片的远程通知

从应用程序 ios swift 中删除使用 UIImagePickerController 拍摄的所有本地图像和视频

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

如何在 Quickblox iOS 中从远程视频中捕获视频帧

swift 笔记:iOS与JavaScript的交互(三):WKWebView 1.新建WKWebView加载本地,远程页面

如何在 swift iOS 中使用 swift 高阶函数从本地 json 创建 ViewModel