2013-08-19 21 views
6

Używam funkcji ExtAudioFileRead do ładowania pliku audio do pamięci. Ale okazało się, że zawsze istnieje błąd z kodem -50. Oznacza to, że przekazuję nieprawidłowe parametry do funkcji. Ale nie mam pojęcia, który z nich jest złym parametrem.ExtAudioFileRead in iOS z kodem błędu -50

Format danych pliku audio jest alac, sampleRate 44100k, ma 2 kanały.

Mój kod znajduje się poniżej:

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); 

Odpowiedz

2

dobre pytanie.

Ten błąd przydarzył mi się po I ExtAudioFileRead pliku MONO, używając formatu danych klienta STEREO w twoim połączeniu z numerem ExtAudioFileSetProperty.

Nie sądzę, że ExtAudioFileRead automatycznie konwertuje pliki mono na pliki stereo, jeśli istnieje niezgodność, wydaje mi się, że nie działa z tym błędem -50.

Utwórz plik mono stereo, lub ustaw inFormat.mChannelsPerFrame=1 dla plików mono.

Pamiętaj, że jeśli nie dokonasz konwersji, musisz uwzględnić pliki mono w swojej funkcji audiorender, zapisując kanały L/R z pojedynczego kanału mono danych.

Powiązane problemy