Я пытаюсь перенаправить звук с произвольного входа (аудиоустройство USB) на произвольный выход (другое аудиоустройство USB). Подумайте о терминах переключателя перекрестных точек. Нет записи, нет обработки, просто подключите вход A к выходу B.Уменьшить задержку/задержку в аудио в AVCaptureSession?
Я смог выполнить это, используя следующий код концепции доказательств, но задержки/задержки между входом и выходом являются чрезмерными (почти 1 секунда). Я видел публикацию (где-то), утверждающую, что AVFoundation использует довольно большие буферы для звука, и это отвечает за задержку, но я нигде не нашел, что могу изменить размер буфера.
Может кто-нибудь предложить решение к сокращению отставания,
ИЛИ:
Обеспечить предложение о том, как я могу интегрировать некоторые (как можно меньше) Core Audio (или другой) код для выполнения моего задача?
В следующем коде «IN_1» и «OUT_0,1» являются агрегатными устройствами, созданными на панели управления Audio MIDI Setup. Для целей тестирования все это реализовано в моем делете приложения теста.
- (void) setUpCaptureSession
{
NSError * error;
self.captureSession = [AVCaptureSession new];
AVCaptureSession * session = self.captureSession;
AVCaptureDevice * inputDevice = [self deviceWithLocalizedName:@"IN_1"];
AVCaptureDevice * outputDevice = [self deviceWithLocalizedName: @"OUT_0,1"];
session.sessionPreset = AVCaptureSessionPresetLow;
if(inputDevice)
{
AVCaptureInput * input = [AVCaptureDeviceInput deviceInputWithDevice: inputDevice error:&error];
if([session canAddInput: input])
{
[session addInput: input];
}
}
if(outputDevice)
{
AVCaptureAudioPreviewOutput * output = [AVCaptureAudioPreviewOutput new];
output.outputDeviceUniqueID = outputDevice.uniqueID;
output.volume = 1.0;
if([session canAddOutput: output])
{
[session addOutput: output];
}
}
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleCaptureSessionError:) name: AVCaptureSessionRuntimeErrorNotification object: self.captureSession];
}
- (AVCaptureDevice *) deviceWithLocalizedName:(NSString *) name
{
AVCaptureDevice * result = nil;
NSArray * devices = [AVCaptureDevice devices];
for(AVCaptureDevice * device in devices)
{
if([device.localizedName isCaseInsensitiveLike: name])
{
result = device;
break;
}
}
return result;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
/* NOTE: latency does NOT reduce if the following are run on a background queue */
[self setUpCaptureSession];
[self.captureSession startRunning];
}