Невозможно настроить звук при потоковой передаче и записи одновременно - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь одновременно транслировать видео и записывать видео, используя заднюю камеру. Проблема здесь в том, что когда присутствуют и видеоплеер, и видеомагнитофон, видеоплеер, кажется, теряет фокус, и нет возможности изменить громкость. В противном случае нажатие кнопок регулировки громкости на телефоне не приводит к изменению громкости.

Есть ли способ каким-то образом вернуть фокус плееру, или это что-то недоступно из-за того, что кнопки громкости отключены, когда 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()
    }
}
...