Я использую AVFoundation
для записи видео. Я также использую CXCallObserverDelegate
для прослушивания, когда телефонный звонок отключен.
Я иду на задний план
Я делаю телефонвызов
Когда телефонный звонок активен, я возвращаю приложение на передний план и нажимаю кнопку, чтобы модально представить виртуальный канал, содержащий AVFoundation
После того, как ВК находится на сцене, и поскольку я в настоящее время разговариваю по телефону, мне звонит .audioDeviceInUseByAnotherClient
, и я прекращаю capture session
Как только телефонный звонок отключаетсязатем вызывается CXCallObserver call.hasEnded
и я перезагружаю capture session
. .sessionInterruptionEnded
также вызывается, но это не вызывает проблемы.
Здесь возникает проблема. Как только 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)
}
}
}
}
}
}