我使用EZAudio库在objective-C中创建了一个iPhone应用程序。
我使用EZMicrophone类& EZRecorder类将音频保存到磁盘。 然而,我希望延迟录制和保存,因此我必须将在EZMicrophone使用的委托方法中接收的AudioBufferList结构传递给NSMutableArray。
我无法将委托方法中收到的AudioBufferList结构传递给NSMutableArray供以后使用。
我将AudioBufferList结构封装在NSValue中。
这是代表方法:
- (void)microphone:(EZMicrophone *)microphone
hasBufferList:(AudioBufferList *)bufferList
withBufferSize:(UInt32)bufferSize
withNumberOfChannels:(UInt32)numberOfChannels {
NSValue *audioData = [NSValue valueWithBytes:bufferList objCType:@encode(AudioBufferList)];
[self.listOfBufferList addObject:audioData];
}
以下是接收AudioBufferList的NSMutableArray的方法
- (void)createAudioFile {
for(int i = 0;i<self.listOfBufferList.count;i++) {
AudioBufferList bufferList;
[self.listOfBufferList[i] getBytes:&bufferList length:BufferSize];
[self.recorder appendDataFromBufferList:&bufferList
withBufferSize:BufferSize];
}
[self.recorder closeAudioFile];
}
我收到了错误:
错误:当我使用应用程序播放文件时,无法从音频文件(-66567)读取音频数据
但是:
[self.recorder appendDataFromBufferList:&bufferList
withBufferSize:BufferSize];
在委托方法中是正确的,音频文件读取没有任何问题所以我的问题是,如何将该AudioBufferList结构封装到一个对象中,该对象在此过程中不会因为我的缘故而丢失app,我需要这两种不同的方法。
另外,当我调试app时,在createAudioFile方法中,我可以看到结构变量被正确复制,但是(void *)的缓冲区与委托方法中找到的缓冲区不同。 (不同的内容和地址)
以下是我试图传递方法的核心音频类型AudioBufferList和AudioBuffer。
struct AudioBufferList
{
UInt32 mNumberBuffers;
AudioBuffer mBuffers[1]; // this is a variable length array of mNumberBuffers elements
};
typedef struct AudioBufferList AudioBufferList;
struct AudioBuffer
{
UInt32 mNumberChannels;
UInt32 mDataByteSize;
void* mData;
};
typedef struct AudioBuffer AudioBuffer;
非常感谢您的帮助,我当然可以获得更多详细信息。
答案 0 :(得分:0)
您应该将AudioBufferLists保存在c数组中。你可以,例如创建一个包含AudioBufferLists数量的结构和包含缓冲区列表的数组。 如果您知道要使用的最大缓冲区列表数,则可以使用该大小定义阵列,并将添加到数组中的实际数字存储在数字成员中。
struct MyBufferLists
{
UInt32 mNumberBufferLists;
AudioBufferList mBufferLists[9]; // enter your max number instead of 9
};
将此结构添加到您需要它的类中。