1

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

我应该加载大约 80 个 m4a 文件并使用包含混音器和 remoteIO 单元的 augraph 播放其中一些文件,这就是我加载文件的方式

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

在渲染回调函数中:

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++;
     }}}

现在,当我播放声音时,我会以双倍速度播放第一部分,然后第二部分只会失真。

4

1 回答 1

1

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

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

确保分配一个数组来读取文件,如下所示:

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

于 2012-07-26T12:23:18.050 回答