EZAudio:如何将一个AudioBufferList结构存储到NSMutableArray以供以后使用?

时间:2015-03-15 18:30:18

标签: ios objective-c ezaudio

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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