0

我正在使用 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;

非常感谢您的帮助,我当然可以提供更多详细信息。

4

1 回答 1

0

您应该将 AudioBufferLists 保存在 ac 数组中。例如,您可以使用 AudioBufferLists 的数量和包含缓冲区列表的数组创建一个结构。如果您知道要使用的最大缓冲区列表数,则可以定义具有该大小的数组并将添加到数组中的实际数字存储在 number 成员中。

struct MyBufferLists
{
    UInt32      mNumberBufferLists;
    AudioBufferList mBufferLists[9]; // enter your max number instead of 9
};

将此结构添加到您需要它的类中。

于 2015-03-15T18:54:56.277 回答