iOS Swift - Wie erhalte ich das Seitenverhältnis von lokalem und entferntem Video?

12

Szenario: Ich erstelle eine WebRTC-Ansicht in einer App. Der Container für Videos hat immer eine Höhe von 160.

In der Mitte des Containers sollte das Remote-Video mit einer maximalen Höhe von 160 angezeigt werden. Die Breite sollte skaliert werden, um das Seitenverhältnis des Videos zu berücksichtigen. Die Breite kann auch nicht größer als die Ansichtsbreite sein. In diesem Fall entspricht die Breite der Ansichtsbreite und die Höhe sollte an das Seitenverhältnis angepasst werden.

In der oberen rechten Ecke sollte das lokale Video von der Frontkamera mit einer maximalen Breite von 100 angezeigt werden, und die Höhe sollte angepasst werden, um das Seitenverhältnis des lokalen Videos zu berücksichtigen

Mein Code bisher:

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

Ich weiß nicht, wie ich das Seitenverhältnis der lokalen oder Remote-Videos ermitteln soll. Wenn ich das hätte, könnte ich die entsprechende Breite und Höhe für jeden von ihnen berechnen

John
quelle
Ich denke, diese Lösung wird Ihrem Problem helfen < stackoverflow.com/questions/10433774/… >
Darshan sk

Antworten:

4

Sie können das AVURLAssetund verwenden CGSize, um die Auflösung für Video zu erhalten

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

Verwenden Sie jetzt natural sizeundpreferredTransform

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

Sie können auch den Skalierungsfaktor finden

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;

Dies kann auch dadurch erreicht werden GPUImageMovie, GPUImageCropFilterundGPUImageMovieWriter

Sreeram Nair
quelle
Ich habe keine URL. Ich habe Videoquelle und RTCVideoTrack von meiner Webcam und Remote VideoTrack, die RTCVideoTrack ist
John