iOS/Sources/App/WebView/WebRTC/WebRTCVideoPlayerViewController.swift
2025-07-07 23:30:02 +02:00

61 lines
2.0 KiB
Swift

import Shared
import SwiftUI
import UIKit
import WebRTC
class WebRTCVideoPlayerViewController: UIViewController {
private let viewModel: WebRTCViewPlayerViewModel
private var remoteVideoView: RTCMTLVideoView!
var onVideoStarted: (() -> Void)?
init(viewModel: WebRTCViewPlayerViewModel) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
setupVideoView()
viewModel.start()
if let client = viewModel.webRTCClient {
client.renderRemoteVideo(to: remoteVideoView)
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
viewModel.webRTCClient?.closeConnection()
}
private func setupVideoView() {
remoteVideoView = RTCMTLVideoView(frame: view.bounds)
remoteVideoView.translatesAutoresizingMaskIntoConstraints = false
remoteVideoView.delegate = self
view.addSubview(remoteVideoView)
NSLayoutConstraint.activate([
remoteVideoView.topAnchor.constraint(equalTo: view.topAnchor),
remoteVideoView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
remoteVideoView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
remoteVideoView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
])
remoteVideoView.videoContentMode = .scaleAspectFit
remoteVideoView.backgroundColor = .black
}
}
extension WebRTCVideoPlayerViewController: RTCVideoViewDelegate {
func videoView(_ videoView: RTCVideoRenderer, didChangeVideoSize size: CGSize) {
// Hide loader when the first frame is rendered
DispatchQueue.main.async { [weak self] in
self?.viewModel.showLoader = false
self?.onVideoStarted?()
}
}
}