簡體   English   中英

EZAudio:如何將AudioBufferList結構存儲到NSMutableArray以便以后使用?

[英]EZAudio : how to store an AudioBufferList struct to an NSMutableArray for later use?

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

非常感謝您的幫助,我當然可以提供更多詳細信息。

您應該將AudioBufferLists保存在ac數組中。 例如,您可以創建帶有AudioBufferLists數量和包含緩沖區列表的數組的結構。 如果知道要使用的最大緩沖區列表數,則可以定義具有該大小的數組,並將添加到數組中的實際數量存儲在number成員中。

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

將此結構添加到需要它的類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM