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
Antworten:
Sie können das
AVURLAsset
und verwendenCGSize
, um die Auflösung für Video zu erhaltenVerwenden Sie jetzt
natural size
undpreferredTransform
Sie können auch den Skalierungsfaktor finden
Dies kann auch dadurch erreicht werden
GPUImageMovie
,GPUImageCropFilter
undGPUImageMovieWriter
quelle