AudioQueue не запускается - PullRequest
       33

AudioQueue не запускается

1 голос
/ 07 ноября 2010

Я создаю AudioQueue в следующих шагах.

  1. Создайте новый вывод с AudioQueueNewOutput
  2. Добавьте прослушиватель свойства для свойства kAudioQueueProperty_IsRunning
  3. Выделите мои буферы с помощью AudioQueueAllocateBuffer
  4. Call AudioQueuePrime
  5. Call AudioQueueStart

Проблема в том, что когда я звоню AudioQueuePrime, он выдает следующееошибка на консоли

AudioConverterNew returned -50
Prime failed (-50); will stop (11025/0 frames)

Что здесь не так?

PS:

  1. Я получил эту ошибку на iOS (Device & Simulator)
  2. Выходной обратный вызов, установленный при вызове AudioQueueNewOutput, никогда не вызывается!
  3. Файл действителен и AudioStreamBasicDescription соответствует формату (AAC)
  4. Я проверил файл с помощью Mat's AudioStreamer и, похоже, он там работает

Пример кода инициализации:


// Get the stream description from the first sample buffer
OSStatus err = noErr;

EDSampleBuffer *firstBuf = [sampleBufs objectAtIndex:0];
AudioStreamBasicDescription asbd = firstBuf.streamDescription;

// TODO: remove temporary format setup, just to ensure format for now
asbd.mSampleRate = 44100.00;
asbd.mFramesPerPacket = 1024; // AAC default
asbd.mChannelsPerFrame = 2;

pfcc(asbd.mFormatID);
// -----------------------------------

// Create a new output
err = AudioQueueNewOutput(&asbd, _audioQueueOutputCallback, self, NULL, NULL, 0, &audioQueue);
if (err) {
    [self _reportError:kASAudioQueueInitializationError];
    goto bail;
}

// Add property listener for queue state
err = AudioQueueAddPropertyListener(audioQueue, kAudioQueueProperty_IsRunning, _audioQueueIsRunningCallback, self);
if (err) {
    [self _reportError:kASAudioQueuePropertyListenerError];
    goto bail;
}

// Allocate a queue buffers
for (int i=0; i<kAQNumBufs; i++) {
    err = AudioQueueAllocateBuffer(audioQueue, kAQDefaultBufSize, &queueBuffer[i]);
    if (err) {
        [self _reportError:kASAudioQueueBufferAllocationError];
        goto bail;
    }
}

// Prime and start
err = AudioQueuePrime(audioQueue, 0, NULL);
if (err) {
    printf("failed to prime audio queue %ld\n", err);
    goto bail;
}

err = AudioQueueStart(audioQueue, NULL);
if (err) {
    printf("failed to start audio queue %ld\n", err);
    goto bail;
}

Это флаги форматирования из потока аудиофайлов

rate: 44100.000000
framesPerPacket: 1024
format: aac 
bitsPerChannel: 0
reserved: 0
channelsPerFrame: 2
bytesPerFrame: 0
bytesPerPacket: 0
formatFlags: 0
cookieSize 39

1 Ответ

4 голосов
/ 07 ноября 2010
AudioConverterNew returned -50
Prime failed (-50); will stop (11025/0 frames)

Что здесь не так?

Вы сделали это неправильно.

Нет, правда. Вот что означает эта ошибка, и это означает ALL .

Вот почему paramErr (-50) такой раздражающий код ошибки: он ничего не говорит о , что вы (или кто-либо другой) сделали неправильно.

Первый шаг к формулированию догадок относительно того, на что он жалуется, - это выяснить, какая функция вернула эту ошибку. Измените метод _reportError:, чтобы позволить вам регистрировать имя функции, которая вернула ошибку. Затем зарегистрируйте параметры, передаваемые этой функции, и выясните, почему, по их мнению, эти параметры для этой функции не имеют смысла.

Мое собственное дикое предположение заключается в том, что значения, которые вы вводили в ASBD, не соответствуют характеристикам буфера семплов. Вывод журнала, который вы включили в свой вопрос, говорит: «11025/0 кадров»; 11025 - это общая частота дискретизации (но отличается от 44100). Я предполагаю, что вы знаете, что означает 0.

...