音频单元播放m4a文件

时间:2012-05-21 15:32:03

标签: objective-c core-audio audiounit aac m4a

我已经在这项任务工作了12天,我找不到任何解决方案请求帮助

我应该加载大约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];
}

这就是我玩它的方式:

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

在rendercallback func中:

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 个答案:

答案 0 :(得分:1)

我认为我遇到了完全相同的问题;

传入的声音采样率较低,因此我分配的数组对于auGraph的较高采样率来说不够大,而且太快而且太短。

确保分配一个数组来读取这样的文件:

sarray-&gt; frames = totalFramesInFile * graphSampleRate / fileAudioFormat.mSampleRate;

相关问题