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 構造体をプロセスで失われないオブジェクトにカプセル化するにはどうすればよいかということです。私のアプリのために、それらが必要であることを知っています2 つの別々の方法。

また、アプリをデバッグすると、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 配列に保存する必要があります。たとえば、AudioBufferList の数とバッファ リストを含む配列を持つ構造体を作成できます。使用するバッファー リストの最大数がわかっている場合は、そのサイズで配列を定義し、配列に追加された実際の数を数値メンバーに格納できます。

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

この構造体を必要なクラスに追加します。

于 2015-03-15T18:54:56.277 に答える