2010-03-15 34 views
4

我在理解的Core Audio,或者说工作读取音频:Extended Audio File Services有扩展音频文件服务(ExtAudioFileRead)

在这里,我想用ExtAudioFileRead()从文件中读取一些音频数据。
这只要罚款,因为我用一个单一的巨大缓冲器来存储我的音频数据(即一个AudioBuffer)的作品。当我使用一个以上的AudioBufferExtAudioFileRead()返回错误代码-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); 

你知道我在做什么错她吗è?

回答

5

我想你误会了mNumberBuffers场的目的。单声道和交错立体声数据通常为1。您将其设置为其他内容的唯一原因是多通道数据,其中每个通道位于单独的数据缓冲区中。

如果要读取文件的一部分,可以将缓冲区的dataByteSize设置为合理的大小,并且当您读取该文件时,请告诉API只给你那么多字节,然后遍历它。

+1

那么,是否有'mNumberBuffers'不是1的情况? – bastibe 2010-03-27 15:01:07

+0

我不确定这个参数是否正确,因为在aurioTouch2示例中,mNumberBuffers设置为2,我想知道是否有人知道原因。 – user454083 2013-08-31 21:40:49

+0

顺便说一句,如果我想同时要么编码或解码缓冲区,我怎么能在单独的线程做这个工作 – user454083 2013-08-31 21:44:51

-3

可可只是似乎无法接受mNumberBuffers> 1,这是一种耻辱,因为它使整个结构无用。 (我希望这是正确的...)

+0

这是不正确的。我相信mNumberBuffers> 1用于多声道音频。只要AudioBufferList结构的其余部分必须有意义。 – notthetup 2012-09-17 08:11:54

1

我也有同样的问题与mNumberBuffers> 1 ,, ... 我的工作围绕参与创造我自己的内部缓冲:

类似:

字符缓冲器1 [byteSize] char buffer2 [byteSize]; ......

你也可以使用指针,使事情变得更容易,..喜欢:

缓冲[指数] [byteSize]

那么你就必须通过手动进行迭代,并填满他们的主线程,以避免在音频故障。

ExtAudioFileRead只会在AudioBufferList填写缓冲区[0],然后你可以有指向不同的手动分配的缓冲区作为音频播放。

希望这有助于。

+0

这不完全是我想要做的,但它肯定有帮助,如果你想填补几个不同的缓冲区不同数据。 (我最初的想法是我可以用来自同一文件的连续数据块填充多个缓冲区)。 – bastibe 2010-04-06 14:36:54

0

mNumberBuffers == 2当您处理非交叉立体声时。这是未交错时的音频通道数量。