Уменьшить задержку / задержку звука в AVCaptureSession?

Я пытаюсь направить звук с произвольного входа (аудиоустройство USB) на произвольный выход (другое аудиоустройство USB). Думайте с точки зрения коммутатора точки пересечения. Нет записи, нет обработки, просто подключите вход A к выходу B.

Я смог сделать это, используя следующий код для проверки концепции, но задержка / задержка между входом и выходом является чрезмерной (почти 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];
}

1 ответ

Для аудио с низкой задержкой используйте аудиоустройства с короткими буферами для записи и воспроизведения, которые могут зависеть от десятков миллисекунд или меньше, в зависимости от аппаратного обеспечения.

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