2015-09-11 3 views
0

Это функция, которую мы используем для настройки AudioStreamBasicDescription (ASBD). На весь класс сильно влияет пример приложения SpeakHere от Apple.Почему это AudioStreamBasicDescription вызывает ошибку AudioConverterNew -50?

Это для записи на устройстве iOS (в частности, iPad Air, также протестированном на iPhone 6 Plus).

При запуске буфера AudioQueue для записи я получаю сообщение «AudioConverterNew received -50» в журналах устройства. По-видимому, это просто означает, что что-то не так правильно? Я предполагаю, что что-то не так с моей ASBD.

- (void)setupAudioFormat 
{ // setup AudioStreamBasicDescription 
    memset(&mDataFormat, 0, sizeof(mDataFormat)); 

    int sampleSize = sizeof(float); 

    AVAudioSession *session = [AVAudioSession sharedInstance]; 
    mDataFormat.mSampleRate = [session sampleRate]; //44100 
    mDataFormat.mChannelsPerFrame = [session inputNumberOfChannels]; // why is this returning 0? 

    if (mDataFormat.mChannelsPerFrame <= 0) 
    { 
     mDataFormat.mChannelsPerFrame = 1; // mono 
    } 

    mDataFormat.mFormatID = kAudioFormatLinearPCM; 
    mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsNonInterleaved; 

    mDataFormat.mBitsPerChannel = 8 * sampleSize; 
    mDataFormat.mBytesPerFrame = sampleSize * mDataFormat.mChannelsPerFrame; 
    mDataFormat.mBytesPerPacket = mDataFormat.mBytesPerFrame; 
    mDataFormat.mFramesPerPacket = 1; 
    mDataFormat.mReserved = 0; 

    NSLog(@"FORMAT sampleRate=%f, channels=%i, flags=%i, BPC=%i, BPF=%i", mDataFormat.mSampleRate, mDataFormat.mChannelsPerFrame, mDataFormat.mFormatFlags, mDataFormat.mBitsPerChannel, mDataFormat.mBytesPerFrame); 
} 

Пример приложение SpeakHere использует Linear PCM, а также, но это настройка с помощью 16-разрядной мало-Endian вместо поплавка.

В конечном счете, мне нужно передать данные звукового буфера на что-то еще в виде массива с плавающей точкой. Должен ли я изменить это, чтобы использовать подписанный 16-разрядный little-endian и преобразовать результаты в значения float?

ответ

1

Ваша строка ниже не имеет смысла.

mDataFormat.mChannelsPerFrame = [session inputNumberOfChannels]; // why is this returning 0? 

Код [session inputNumberOfChannels] получает количество каналов, доступных в системе в данный момент. Если вы используете только встроенный микрофон, он может вернуть 1 или 2 канала. Если вы подключите предусилитель usb, вы можете иметь 4 или 8 или более каналов ввода. Поэтому нет смысла устанавливать формат в зависимости от количества доступных входных каналов. Вы,, обычно устанавливаете формат записи как монофонический или стереофонический и маршрутизируете входы по вашему желанию.

В какой-то момент вы хотите, чтобы активировать сеанс с помощью:

BOOL activated = [[AVAudioSession sharedInstance] setActive:YES error:&error]; 
NSLog(@"AVAudioSession activated %i",activated); 

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

+0

Проблема заключалась в активации AVAudioSession. Я предполагаю, что сессия вернулась 0, потому что она неактивна. Я изменил его на моно, но этот код был основан на чужом примере, и я не уверен, почему они сделали это так. Я предполагаю, что было больше кода для обработки, однако было доступно много каналов, но я больше не могу найти этот пример. – Simurr

Смежные вопросы