2012-05-21 123 views
1

我一直對這個任務12天,我找不到任何解決方案pleaaaaase幫助音頻單元播放M4A文件

我應該裝載約80 M4A等文件,並與augraph包含發揮他們中的一些混頻器和remoteIO單位,這是我如何加載文件

OSStatus result; 
for (int i = 0; i < [filePaths count]; i++) { 
    NSMutableArray *linearr=[[NSMutableArray alloc] init]; 
    for (int j = 0; j < [[filePaths objectAtIndex:i] count]; j++) { 
     NSString *str=[[filePaths objectAtIndex:i] objectAtIndex:j]; 

     CFURLRef audioFileURL = CFURLCreateFromFileSystemRepresentation (NULL, (const UInt8 *)[str cStringUsingEncoding:[NSString defaultCStringEncoding]] , strlen([str cStringUsingEncoding:[NSString defaultCStringEncoding]]), false); 
     ExtAudioFileRef audiofile; 
     ExtAudioFileOpenURL(audioFileURL, &audiofile); 
     assert(audiofile); 
     OSStatus err; 
     AudioStreamBasicDescription fileFormat; 
     UInt32 size = sizeof(fileFormat); 
     err = ExtAudioFileGetProperty(audiofile, kExtAudioFileProperty_FileDataFormat, &size, &fileFormat); 

     AudioFileID aFile; 
     //size = sizeof(aFile); 
     PropertySize =sizeof(PacketsToRead); 
     err = ExtAudioFileGetProperty(audiofile, kExtAudioFileProperty_AudioFile, &PropertySize, &aFile); 
     AudioFileTypeID fileType; 
     PropertySize = sizeof(fileType); 
     err = AudioFileGetProperty(aFile, kAudioFilePropertyFileFormat, &PropertySize, &fileType); 
     AudioStreamBasicDescription clientFormat; 
     bzero(&clientFormat, sizeof(clientFormat)); 
     clientFormat.mChannelsPerFrame = 2; 
     clientFormat.mBytesPerFrame = 4; 
     clientFormat.mBytesPerPacket = clientFormat.mBytesPerFrame; 
     clientFormat.mFramesPerPacket = 1; 
     clientFormat.mBitsPerChannel = 32; 
     clientFormat.mFormatID = kAudioFormatLinearPCM; 
     clientFormat.mSampleRate = 44100.00; 
     clientFormat.mFormatFlags =kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsNonInterleaved; //kLinearPCMFormatFlagIsFloat | kAudioFormatFlagIsNonInterleaved; 

     err = ExtAudioFileSetProperty(audiofile, kExtAudioFileProperty_ClientDataFormat, sizeof(clientFormat), &clientFormat); 

     SInt64 numFrames = 0; 
     PropertySize = sizeof(numFrames); 
     err = ExtAudioFileGetProperty(audiofile, kExtAudioFileProperty_FileLengthFrames, &PropertySize, &numFrames); 
     NSNumber *pc = [NSNumber numberWithLongLong:numFrames]; 
     [[packetCount objectAtIndex:i] replaceObjectAtIndex:j withObject:pc]; 
     // create the buffers for reading in data 
     bufferList = malloc(sizeof(AudioBufferList) + sizeof(AudioBuffer) * (clientFormat.mChannelsPerFrame - 1)); 
     bufferList->mNumberBuffers = clientFormat.mChannelsPerFrame; 
     for (int ii=0; ii < bufferList->mNumberBuffers; ++ii) { 
      bufferList->mBuffers[ii].mDataByteSize = sizeof(float) * numFrames; 
      bufferList->mBuffers[ii].mNumberChannels = 2; 
      bufferList->mBuffers[ii].mData = malloc(bufferList->mBuffers[ii].mDataByteSize); 
     } 

     UInt32 rFrames = 0; 
     rFrames =(UInt32)numFrames; 
     err = ExtAudioFileRead(audiofile, &rFrames, bufferList); 
     [linearr addObject:[NSData dataWithBytes:bufferList->mBuffers[1].mData length:numFrames]]; 
     err = ExtAudioFileDispose(audiofile); 

} 
    [audioData addObject:linearr]; 
} 

,這就是我怎麼玩:在rendercallback FUNC

UInt32 *buslist; 
buslist=(UInt32*)[[[audioData objectAtIndex:0] objectAtIndex:4]bytes ]; 

for (int i = 0 ; i < ioData->mNumberBuffers; i++){ 
    UInt32 *au3=au->mBuffers[0].mData; 
    AudioBuffer buffer = ioData->mBuffers[i]; 
    UInt32 *frameBuffer = buffer.mData; 
    for (int j = 0; j < inNumberFrames; j++) 
    { 
     frameBuffer[j] = buflist[counter]; 
     if(counter>=529200) 
      counter=0; 
     else 
      counter++; 
    }}} 

現在,當我播放聲音我得到的第一部分玩雙倍速然後第二部分只有失真。

回答

1

我的想法完全一樣,

傳入的聲音處於較低的採樣率,因此我分配的陣列對AuGraph的較高採樣率來說不夠大,而且速度太快而且太短。

確保您分配一個陣列讀取該文件是這樣的:

sarray->幀= totalFramesInFile * graphSampleRate/fileAudioFormat.mSampleRate;

+0

thnx我想我解決了它的方式:) –