시나리오 : 앱 내에 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
영상의 해상도를 얻을 수
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))
}
이제, 사용 natural size
및preferredTransform
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)
}
또한 스케일 팩터를 찾을 수 있습니다
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;
이것은 또한에 의해 달성 될 수있다 GPUImageMovie
, GPUImageCropFilter
그리고GPUImageMovieWriter