Внесение изменений в AVCaptureSession нарушает фоновое аудио

Я использую AVCaptureSession для записи видео, и я также поддерживаю аудио из других приложений, делая это. Всякий раз, когда я делаю изменения в AVCaptureSessionНапример, переключение камеры между передней и задней панелями, звук из музыки или Spotify задерживается примерно на секунду. Этого не происходит при переключении камеры в Snapchat, поэтому должен быть способ обойти это. У них есть небольшая задержка при запуске камеры, но не при ее переключении.

В этом посте упоминается, что переключение между маршрутами только для аудио к маршрутам видеозаписи является настолько большим изменением, что ожидается небольшое отставание, но я не касаюсь AVAudioSessionCategory при переключении камер.

Вот как я переключаюсь между входами камеры:

- (void)changeCamera
{
    dispatch_async(self.sessionQueue, ^{
        AVCaptureDevice *currentVideoDevice = [self.videoDeviceInput device];
        AVCaptureDevicePosition preferredPosition = AVCaptureDevicePositionUnspecified;
        AVCaptureDevicePosition currentPosition = [currentVideoDevice position];

        switch (currentPosition)
        {
            case AVCaptureDevicePositionUnspecified:
                preferredPosition = AVCaptureDevicePositionBack;
                self.position = EACameraPositionBack;
                break;
            case AVCaptureDevicePositionBack:
                preferredPosition = AVCaptureDevicePositionFront;
                self.position = EACameraPositionFront;
                break;
            case AVCaptureDevicePositionFront:
                preferredPosition = AVCaptureDevicePositionBack;
                self.position = EACameraPositionBack;
                break;
        }

        AVCaptureDevice *videoDevice = [self deviceWithMediaType:AVMediaTypeVideo preferringPosition:preferredPosition];

        AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];

        [[self session] beginConfiguration];

        [[self session] removeInput:[self videoDeviceInput]];
        if ([[self session] canAddInput:videoDeviceInput])
        {
            [[NSNotificationCenter defaultCenter] removeObserver:self name:AVCaptureDeviceSubjectAreaDidChangeNotification object:currentVideoDevice];

            [self.cameraFlash setFlashMode:AVCaptureFlashModeAuto torchMode:AVCaptureTorchModeAuto forDevice:videoDevice];

            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:videoDevice];

            [[self session] addInput:videoDeviceInput];
            [self setVideoDeviceInput:videoDeviceInput];
        }
        else
        {
            [[self session] addInput:[self videoDeviceInput]];
        }

        [[self session] commitConfiguration];
    });
}

0 ответов

Другие вопросы по тегам