2013-08-19 2 views
6

Я использую функцию ExtAudioFileRead для загрузки аудиофайла в память. Но я обнаружил, что всегда есть ошибка с кодом -50. Это означает, что я передаю неправильные параметры функции. Но я не знаю, какой из них является неправильным параметром.ExtAudioFileRead в iOS с кодом ошибки -50

Формат данных аудиофайла - alac, sampleRate 44100k, имеет 2 канала.

Мой код показан ниже:

ExtAudioFileRef recordFile; 
OSStatus error = noErr; 
error = ExtAudioFileOpenURL((CFURLRef)file, &recordFile); 
checkError(error, "open file"); 

SInt64 frameCount; 
UInt32 size = sizeof(frameCount); 
error = ExtAudioFileGetProperty(recordFile, kExtAudioFileProperty_FileLengthFrames, &size, &frameCount); 
checkError(error, "get frameTotlal"); 

soundStruct *sound = &_sound; 
sound->frameCount = frameCount; 
sound->isStereo = true; 
sound->audioDataLeft = (SInt16 *)calloc(frameCount, sizeof(SInt16)); 
sound->audioDataRight = (SInt16 *)calloc(frameCount, sizeof(SInt16)); 

AudioStreamBasicDescription desc; 
UInt32 descSize = sizeof(desc); 
error = ExtAudioFileGetProperty(recordFile, kExtAudioFileProperty_FileDataFormat, &descSize, &desc); 


[self printASBD:desc]; 

UInt32 channels = desc.mChannelsPerFrame; 

error = ExtAudioFileSetProperty(recordFile, kExtAudioFileProperty_ClientDataFormat, sizeof(inFormat), &inFormat); 

AudioBufferList *bufferList; 
bufferList = (AudioBufferList *)malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * (channels - 1)); 

AudioBuffer emptyBuff = {0}; 
size_t arrayIndex; 
for (arrayIndex = 0; arrayIndex < channels; arrayIndex ++) { 
    bufferList->mBuffers[arrayIndex] = emptyBuff; 
} 

bufferList->mBuffers[0].mData = sound->audioDataLeft; 
bufferList->mBuffers[0].mNumberChannels = 1; 
bufferList->mBuffers[0].mDataByteSize = frameCount * sizeof(SInt16); 
if (channels == 2) { 
    bufferList->mBuffers[1].mData = sound->audioDataRight; 
    bufferList->mBuffers[1].mNumberChannels = 1; 
    bufferList->mBuffers[1].mDataByteSize = frameCount * sizeof(SInt16); 
    bufferList->mNumberBuffers = 2; 
} 

UInt32 count = (UInt32)frameCount; 

error = ExtAudioFileRead(recordFile, &count, bufferList); 
checkError(error, "reading"); // Get a -50 error 

free(bufferList); 
ExtAudioFileDispose(recordFile); 

ответ

2

Хороший вопрос.

Эта ошибка произошла со мной, когда я ExtAudioFileRead файл MONO, используя формат данных клиента STEREO при вызове ExtAudioFileSetProperty.

Не думаю, что ExtAudioFileRead автоматически преобразует моно файлы в стереофайлы, если есть несоответствие там, я думаю, что это сбой с этой ошибкой -50.

Либо сделайте монофонический файл стерео, илиinFormat.mChannelsPerFrame=1 для монофонических файлов.

Помните, что если вы не повышаете преобразование, вы должны учитывать монофонические файлы в вашей функции audiorender, записывая каналы L/R из одного моноканала данных.

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

  • Нет связанных вопросов^_^