我正在努力理解核心音频,或者更确切地说:Extended Audio File Services
这里,我想使用ExtAudioFileRead()从文件中读取一些音频数据。
只要我使用一个巨大的缓冲区来存储我的音频数据(即一个AudioBuffer),就可以很好地工作。只要我使用了多个参数,ExtAudioFileRead()就会返回错误码-50 (“参数列表中的错误”)。据我所知,这意味着ExtAudioFileRead()的一个参数是错误的。可能是audioBufferList吧。
我不能使用一个巨大的缓冲区,因为那样,dataByteSize的UInt32-integer范围将溢出巨大的文件。
下面是创建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);你知道我做错了什么吗?
发布于 2010-03-26 14:50:04
我认为您误解了mNumberBuffers字段的用途。它通常是单声道和交错立体声数据的1。将其设置为其他值的唯一原因是用于多轨迹数据,其中每个通道都位于单独的数据缓冲区中。
如果你想读取文件的一部分,你可以将缓冲区的dataByteSize设置为一个合理的大小,当你读取文件时,告诉API只给你那么多字节,并循环它。
发布于 2010-04-06 06:16:07
当mNumberBuffers > 1时,我也遇到了同样的问题,...我的工作涉及创建自己的内部缓冲区:
类似于:
char buffer1byteSize;char buffer2byteSize;......
你也可以使用指针让事情变得更简单,..like:
bufferindex;
然后,您必须手动迭代它们,并在主线程上填充它们,以避免音频中的毛刺。
ExtAudioFileRead将只填充AudioBufferList中的缓冲区,然后当音频播放时,您可以将其指向不同的手动分配的缓冲区。
希望这能有所帮助。
发布于 2017-03-21 08:11:52
在处理非交错立体声时使用mNumberBuffers == 2。它是未交错时的音频通道数。
https://stackoverflow.com/questions/2450248
复制相似问题