Escenario: estoy construyendo una vista WebRTC dentro de una aplicación El contenedor para videos siempre tendrá una altura de 160.
En el centro del contenedor debe mostrarse el video remoto con una altura máxima de 160, el ancho debe ajustarse para respetar la relación de aspecto del video. El ancho tampoco puede ser mayor que el ancho de la vista, en ese caso el ancho será igual al ancho de la vista y la altura debe adaptarse a la relación de aspecto.
En la esquina superior derecha, debe mostrarse el video local de la cámara frontal con un ancho máximo de 100 y la altura debe adaptarse para respetar la relación de aspecto del video local
mi código hasta ahora:
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!)
}
}
}
No sé cómo obtener la relación de aspecto de ninguno de los videos, local o remoto. Si tuviera eso, podría calcular el ancho y la altura apropiados para cada uno de ellos.
Respuestas:
Puede usar
AVURLAsset
yCGSize
para obtener la resolución del videoAhora, use
natural size
ypreferredTransform
Además, puedes encontrar el factor de escala
Esto también se puede lograr con
GPUImageMovie
,GPUImageCropFilter
yGPUImageMovieWriter
fuente