我正在使用 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 结构封装到一个不会在过程中丢失的对象中,因为我知道为了我的应用程序,我需要那些两种不同的方法。
此外,当我调试应用程序时,在 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;
非常感谢您的帮助,我当然可以提供更多详细信息。