首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EZAudio :如何将AudioBufferList结构存储到NSMutableArray以供以后使用?

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

Stack Overflow用户
提问于 2015-03-15 18:30:18
回答 1查看 702关注 0票数 0

我正在使用iPhone库在objective中创建一个EZAudio应用程序。

我使用EZMicrophone类& EZRecorder类将音频保存到磁盘。但是,我希望延迟记录和保存,因此我必须将EZMicrophone使用的委托方法中接收到的EZMicrophone结构传递给NSMutableArray。

我很难将委托方法中接收到的AudioBufferList结构传递给NSMutableArray以供以后使用。

我将AudioBufferList结构封装在一个NSValue中。

来源

下面是委托方法:

代码语言:javascript
复制
- (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的方法

代码语言:javascript
复制
- (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)读取音频数据。

但当:

代码语言:javascript
复制
[self.recorder appendDataFromBufferList:&bufferList
                                     withBufferSize:BufferSize];

在委托方法中,音频文件的读取没有任何问题,所以我的问题是,如何将AudioBufferList结构封装到一个不会丢失的对象中,因为为了我的应用程序,我需要这两个独立的方法。

此外,在调试应用程序时,在createAudioFile方法中,我可以看到结构变量被正确复制,但是缓冲区(void*)与委托方法中的缓冲区不同。(内容和地址不同)

下面是我正在尝试传递的核心音频类型AudioBufferList和AudioBuffer。

代码语言:javascript
复制
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;

非常感谢您的帮助,我当然可以了解更多的细节。

EN

回答 1

Stack Overflow用户

发布于 2015-03-15 18:54:56

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

代码语言:javascript
复制
struct MyBufferLists
{
    UInt32      mNumberBufferLists;
    AudioBufferList mBufferLists[9]; // enter your max number instead of 9
};

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29064538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档