1

私はこのタスクに12日間取り組んできましたが、解決策が見つかりません。

私は約80のm4aファイルをロードし、それらのいくつかをaugraphで再生することになっています。この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++;
     }}}

これで、サウンドを再生すると、最初の部分が2倍の速度で再生され、2番目の部分は歪みのみで再生されます。

4

1 に答える 1

1

私は私が思うのとまったく同じ問題を抱えていました。

着信音のサンプルレートが低かったため、割り当てた配列はauGraphのサンプルレートを高くするには十分な大きさではなく、速すぎて短すぎました。

次のようなファイルを読み取るために配列を割り当てていることを確認してください。

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

于 2012-07-26T12:23:18.050 に答える