Я пытаюсь одновременно транслировать видео и записывать видео, используя заднюю камеру. Проблема здесь в том, что когда присутствуют и видеоплеер, и видеомагнитофон, видеоплеер, кажется, теряет фокус, и нет возможности изменить громкость. В противном случае нажатие кнопок регулировки громкости на телефоне не приводит к изменению громкости.
Есть ли способ каким-то образом вернуть фокус плееру, или это что-то недоступно из-за того, что кнопки громкости отключены, когда UIImagePickerController
присутствует.
Проблема все еще возникает даже без вызова imagePickers.startVideoCapture()
.
Вот простая версия кода, используемого для воспроизведения проблемы.
import AVFoundation
import UIKit
class ViewController: UIViewController {
private let videoPlayerView: UIView = {
let view = UIView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()
private var playerLayer: AVPlayerLayer!
private var imagePickers: UIImagePickerController!
private var player: AVPlayer!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(videoPlayerView)
NSLayoutConstraint.activate([
videoPlayerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
videoPlayerView.leftAnchor.constraint(equalTo: view.leftAnchor),
videoPlayerView.rightAnchor.constraint(equalTo: view.rightAnchor),
videoPlayerView.heightAnchor.constraint(equalToConstant: 200),
])
addImagePickerToContainerView()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
setupVideoPlayer()
startPlayerAndVideoRecording()
}
private func setupVideoPlayer() {
guard
let url = URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
else { preconditionFailure("Invalid URL!") }
player = AVPlayer(url: url)
playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = videoPlayerView.bounds
playerLayer.videoGravity = .resizeAspect
videoPlayerView.layer.addSublayer(playerLayer)
}
private func addImagePickerToContainerView() {
guard UIImagePickerController.isSourceTypeAvailable(.camera)
else { preconditionFailure("Camera not available!") }
imagePickers = UIImagePickerController()
imagePickers.sourceType = .camera
imagePickers.cameraDevice = .front
imagePickers.showsCameraControls = false
imagePickers.mediaTypes = ["public.movie"]
imagePickers.cameraCaptureMode = .video
imagePickers.willMove(toParent: self)
addChild(imagePickers)
view.addSubview(imagePickers.view)
imagePickers.view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
imagePickers.view.topAnchor.constraint(equalTo: videoPlayerView.bottomAnchor),
imagePickers.view.centerXAnchor.constraint(equalTo: view.centerXAnchor),
imagePickers.view.widthAnchor.constraint(equalToConstant: 112),
imagePickers.view.heightAnchor.constraint(lessThanOrEqualToConstant: 200),
])
imagePickers.didMove(toParent: self)
}
private func startPlayerAndVideoRecording() {
imagePickers.startVideoCapture()
player.play()
}
}