Scénario: Je crée une vue WebRTC dans une application Le conteneur de vidéos aura toujours une hauteur de 160.
Au centre du conteneur, la vidéo à distance doit être affichée avec une hauteur maximale de 160, la largeur doit être mise à l'échelle pour respecter le rapport d'aspect de la vidéo. La largeur ne peut pas non plus être supérieure à la largeur de la vue, dans ce cas, la largeur sera égale à la largeur de la vue et la hauteur doit être adaptée au rapport d'aspect.
Dans le coin supérieur droit, la vidéo locale de la caméra frontale doit être affichée avec une largeur maximale de 100 et la hauteur doit être adaptée pour respecter le rapport d'aspect de la vidéo locale
mon code jusqu'à présent:
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!)
}
}
}
Je ne sais pas comment obtenir le rapport d'aspect des vidéos, locales ou distantes. Si j'avais cela, je pourrais calculer la largeur et la hauteur appropriées pour chacun d'eux
Réponses:
Vous pouvez utiliser le
AVURLAsset
etCGSize
pour obtenir la résolution de la vidéoMaintenant, utilisez
natural size
etpreferredTransform
Vous pouvez également trouver le facteur d'échelle
Cela peut également être réalisé par
GPUImageMovie
,GPUImageCropFilter
etGPUImageMovieWriter
la source