首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用扩展音频文件服务(ExtAudioFileRead)读取音频

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

Stack Overflow用户
提问于 2010-03-16 04:29:11
回答 4查看 7.4K关注 0票数 4

我正在努力理解核心音频,或者更确切地说:Extended Audio File Services

这里,我想使用ExtAudioFileRead()从文件中读取一些音频数据。

只要我使用一个巨大的缓冲区来存储我的音频数据(即一个AudioBuffer),就可以很好地工作。只要我使用了多个参数,ExtAudioFileRead()就会返回错误码-50 (“参数列表中的错误”)。据我所知,这意味着ExtAudioFileRead()的一个参数是错误的。可能是audioBufferList吧。

我不能使用一个巨大的缓冲区,因为那样,dataByteSizeUInt32-integer范围将溢出巨大的文件。

下面是创建audioBufferList的代码

代码语言:javascript
复制
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);
}

下面是有效的,但溢出的代码:

代码语言:javascript
复制
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()的调用(应该适用于两个版本):

代码语言:javascript
复制
UInt32 numFrames = fileLengthInFrames;
error = ExtAudioFileRead(extAudioFileRef,
                         &numFrames,
                         audioBufferList);

你知道我做错了什么吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-26 14:50:04

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

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

票数 5
EN

Stack Overflow用户

发布于 2010-04-06 06:16:07

当mNumberBuffers > 1时,我也遇到了同样的问题,...我的工作涉及创建自己的内部缓冲区:

类似于:

char buffer1byteSize;char buffer2byteSize;......

你也可以使用指针让事情变得更简单,..like:

bufferindex;

然后,您必须手动迭代它们,并在主线程上填充它们,以避免音频中的毛刺。

ExtAudioFileRead将只填充AudioBufferList中的缓冲区,然后当音频播放时,您可以将其指向不同的手动分配的缓冲区。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-03-21 08:11:52

在处理非交错立体声时使用mNumberBuffers == 2。它是未交错时的音频通道数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2450248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档