gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:23 24 4
gpt4 key购买 nike

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

在这里,我想使用 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);

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

最佳答案

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

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

关于objective-c - 使用扩展音频文件服务 (ExtAudioFileRead) 读取音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com