Внесение изменений в 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];
});
}