AVFoundation- .audioDeviceInUseByAnotherClient запускается после вызова CXCallObserver call.hasEnded (разъединение вызова) - PullRequest
1 голос
/ 19 октября 2019

Я использую AVFoundation для записи видео. Я также использую CXCallObserverDelegate для прослушивания, когда телефонный звонок отключен.

  1. Я иду на задний план

  2. Я делаю телефонвызов

  3. Когда телефонный звонок активен, я возвращаю приложение на передний план и нажимаю кнопку, чтобы модально представить виртуальный канал, содержащий AVFoundation

  4. После того, как ВК находится на сцене, и поскольку я в настоящее время разговариваю по телефону, мне звонит .audioDeviceInUseByAnotherClient, и я прекращаю capture session

  5. Как только телефонный звонок отключаетсязатем вызывается CXCallObserver call.hasEnded и я перезагружаю capture session. .sessionInterruptionEnded также вызывается, но это не вызывает проблемы.

  6. Здесь возникает проблема. Как только call.hasEnded вызывается, то .audioDeviceInUseByAnotherClient снова вызывается . Поскольку код для остановки сеанса захвата находится там, это приводит к тому, что сеанс захвата снова останавливается

На шаге 6 почему .audioDeviceInUseByAnotherClient вызывается снова после вызовабыл отключен?

func sessionWasInterrupted(notification: NSNotification) {

    let reasonIntegerValue = userInfoValue.integerValue,
    let reason = AVCaptureSession.InterruptionReason(rawValue: reasonIntegerValue) {

        case .audioDeviceInUseByAnotherClient:

            stopCaptureSession()
        }
    }
}

func sessionInterruptionEnded(notification: NSNotification) {
    print("-----Capture session interruption ended")

    restartCaptureSession()
}

func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {

    if call.hasEnded == true {
        print("\nCXCallState :Disconnected")

        restartCaptureSession()
    }

    if call.hasConnected == true && call.hasEnded == false {
        print("\nCXCallState : Connected")

        // *** THIS NEVER GETS CALLED IN THIS SCENARIO ***
    }
}

fileprivate func stopCaptureSession() {

    if captureSession.isRunning {

        DispatchQueue.global(qos: .background).async { [weak self] in

            DispatchQueue.main.sync {
                self?.captureSession.stopRunning()
            }

            DispatchQueue.main.async {
                self?.previewLayer?.removeFromSuperlayer()
                self?.previewLayer = nil
            }
        }
    }
}

func restartCaptureSession() {

    if !captureSession.isRunning {

        DispatchQueue.global(qos: .background).async { [weak self] in

            DispatchQueue.main.sync {
                self?.captureSession.startRunning()
            }

            DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {

                if let safeSelf = self {

                    if safeSelf.previewLayer == nil {

                        self?.previewLayer = AVCaptureVideoPreviewLayer(session: self!.captureSession)
                        self?.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
                        guard let previewLayer = self?.previewLayer else { return }
                        previewLayer.frame = self!.containerViewForPreviewLayer.bounds
                        self?.containerViewForPreviewLayer.layer.insertSublayer(previewLayer, at: 0)
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...