Skenario: Saya sedang membangun tampilan WebRTC di dalam aplikasi. Kontainer untuk video akan selalu memiliki tinggi 160.
Di tengah wadah harus ditampilkan video jarak jauh dengan tinggi maksimal 160, lebar harus diskalakan untuk menghormati rasio aspek video. Lebar juga tidak boleh lebih besar dari lebar tampilan, dalam hal itu lebar akan sama dengan lebar tampilan dan tinggi harus disesuaikan dengan aspek rasio.
Di sudut kanan atas harus ditampilkan video lokal dari kamera depan dengan lebar maksimal 100 dan tinggi harus disesuaikan untuk menghormati aspek rasio video lokal
kode saya sejauh ini:
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!)
}
}
}
Saya tidak tahu cara mendapatkan rasio aspek dari video, lokal atau jarak jauh. Jika saya punya itu, saya bisa menghitung lebar dan ketinggian yang sesuai untuk masing-masing
Jawaban:
Anda dapat menggunakan
AVURLAsset
danCGSize
untuk mendapatkan resolusi untuk videoSekarang, Gunakan
natural size
danpreferredTransform
Anda juga dapat menemukan faktor skala
Ini juga dapat dicapai dengan
GPUImageMovie
,GPUImageCropFilter
danGPUImageMovieWriter
sumber