Сценарий: я создаю представление 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!)
}
}
}
Я не знаю, как получить соотношение сторон любого из видео, локального или удаленного. Если бы у меня было это, я мог бы вычислить соответствующую ширину и высоту для каждого из них
Ответы:
Вы можете использовать
AVURLAsset
и,CGSize
чтобы получить разрешение для видеоТеперь используйте
natural size
иpreferredTransform
Также вы можете найти масштабный коэффициент
Это также может быть достигнуто
GPUImageMovie
,GPUImageCropFilter
иGPUImageMovieWriter
источник