使用扩展音频文件服务读取音频(ExtAudioFileRead)

bas*_*ibe 4 struct objective-c core-audio

我正在努力了解Core Audio,或者更确切地说:扩展音频文件服务

在这里,我想用来ExtAudioFileRead()从文件中读取一些音频数据.
只要我使用一个巨大的缓冲区来存储我的音频数据(即一个AudioBuffer),这就可以正常工作.只要我使用多个AudioBuffer,就会ExtAudioFileRead()返回错误代码-50("参数列表中的错误").据我所知,这意味着其中一个论点ExtAudioFileRead()是错误的.可能是audioBufferList.

我不能使用一个巨大的缓冲区,因为那时,dataByteSize它将溢出其UInt32整数范围与巨大的文件.

这是创建的代码audioBufferList:

AudioBufferList *audioBufferList;
audioBufferList = malloc(sizeof(AudioBufferList) + (numBuffers-1)*sizeof(AudioBuffer));
audioBufferList->mNumberBuffers = numBuffers;
for (int bufferIdx = 0; bufferIdx<numBuffers; bufferIdx++ ) {
    audioBufferList->mBuffers[bufferIdx].mNumberChannels = numChannels;
    audioBufferList->mBuffers[bufferIdx].mDataByteSize = dataByteSize;
    audioBufferList->mBuffers[bufferIdx].mData = malloc(dataByteSize);
}
Run Code Online (Sandbox Code Playgroud)

这是工作但溢出的代码:

UInt32 dataByteSize = fileLengthInFrames * bytesPerFrame; // this will overflow
AudioBufferList *audioBufferList = malloc(sizeof(audioBufferList));
audioBufferList->mNumberBuffers = 1;
audioBufferList->mBuffers[0].mNumberChannels = numChannels;
audioBufferList->mBuffers[0].mDataByteSize = dataByteSize;
audioBufferList->mBuffers[0].mData = malloc(dataByteSize);
Run Code Online (Sandbox Code Playgroud)

最后,调用ExtAudioFileRead()(应该适用于两个版本):

UInt32 numFrames = fileLengthInFrames;
error = ExtAudioFileRead(extAudioFileRef,
                         &numFrames,
                         audioBufferList);
Run Code Online (Sandbox Code Playgroud)

你知道我在做错了什么吗?

luc*_*ius 5

我认为你误解了mNumberBuffers字段的用途.它通常1用于单声道和交错立体声数据.将其设置为其他内容的唯一原因是多轨数据,其中每个通道位于单独的数据缓冲区中.

如果你想读取文件的一部分,你可以将缓冲区的dataByteSize设置为合理的大小,当你读取文件时,告诉API只给你那么多字节,然后循环它.