我在理解的Core Audio,或者说工作读取音频:Extended Audio File Services有扩展音频文件服务(ExtAudioFileRead)
在这里,我想用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);
}
这里是工作,但溢出代码:
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);
最后的ExtAudioFileRead()
(电话应于这两种版本):
UInt32 numFrames = fileLengthInFrames;
error = ExtAudioFileRead(extAudioFileRef,
&numFrames,
audioBufferList);
你知道我在做什么错她吗è?
那么,是否有'mNumberBuffers'不是1的情况? – bastibe 2010-03-27 15:01:07
我不确定这个参数是否正确,因为在aurioTouch2示例中,mNumberBuffers设置为2,我想知道是否有人知道原因。 – user454083 2013-08-31 21:40:49
顺便说一句,如果我想同时要么编码或解码缓冲区,我怎么能在单独的线程做这个工作 – user454083 2013-08-31 21:44:51