我正在使用iPhone库在objective中创建一个EZAudio应用程序。
我使用EZMicrophone类& EZRecorder类将音频保存到磁盘。但是,我希望延迟记录和保存,因此我必须将EZMicrophone使用的委托方法中接收到的EZMicrophone结构传递给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];
}下面是接收NSMutableArray of AudioBufferList的方法
- (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结构封装到一个不会丢失的对象中,因为为了我的应用程序,我需要这两个独立的方法。
此外,在调试应用程序时,在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;非常感谢您的帮助,我当然可以了解更多的细节。
发布于 2015-03-15 18:54:56
您应该将AudioBufferLists保存在c数组中。例如,您可以创建一个包含AudioBufferLists数量和包含缓冲区列表的数组的结构。如果您知道要使用的缓冲区列表的最大数量,则可以定义具有该大小的数组,并将添加到该数组的实际编号存储在number成员中。
struct MyBufferLists
{
UInt32 mNumberBufferLists;
AudioBufferList mBufferLists[9]; // enter your max number instead of 9
};将此结构添加到需要此结构的类中。
https://stackoverflow.com/questions/29064538
复制相似问题