在AudioUnit播放回调中播放来自AudioBuffer-> mdata的音频

时间:2016-08-22 14:23:01

标签: ios objective-c avfoundation core-audio audiounit

我一直在搜索并尝试解决以下问题。没有成功

好的,所以我一直在使用苹果示例代码项目名称WiTap使用NSInputStreamsNSOutputStreams通过wifi与两台设备进行通信我已经能够传输数据(音频)数据)b / w设备成功。

但是,在目标设备上,我接收数据并将其填入音频缓冲区,如下所示:

bytesRead = [self.inputStream read:anAudioBuffer.mData maxLength:anAudioBuffer.mDataByteSize];

anAudioBuffer本身声明如下

anAudioBuffer.mNumberChannels = 1;
anAudioBuffer.mDataByteSize = 512 * 2;
anAudioBuffer.mData = malloc( 512 * 2 );

现在我从Apple的示例代码中的AudioUnit Callback中以someObject.anAudioBuffer的形式访问此音频缓冲区

如下

static OSStatus playbackCallback(void *inRefCon, 
                                 AudioUnitRenderActionFlags *ioActionFlags, 
                                 const AudioTimeStamp *inTimeStamp, 
                                 UInt32 inBusNumber, 
                                 UInt32 inNumberFrames, 
                                 AudioBufferList *ioData) {    
    // Notes: ioData contains buffers (may be more than one!)
    // Fill them up as much as you can. Remember to set the size value in each buffer to match how
    // much data is in the buffer.

    for (int i=0; i < ioData->mNumberBuffers; i++) { // in practice we will only ever have 1 buffer, since audio format is mono
        AudioBuffer buffer = ioData->mBuffers[i];

        // copy temporary buffer data to output buffer
        UInt32 size = min(buffer.mDataByteSize, someObject.anAudioBuffer.mDataByteSize); // dont copy more data then we have, or then fits
        memcpy(buffer.mData, someObject.anAudioBuffer.mData, size);
        buffer.mDataByteSize = size; // indicate how much data we wrote in the buffer

        // uncomment to hear random noise
        /*
        UInt16 *frameBuffer = buffer.mData;
        for (int j = 0; j < inNumberFrames; j++) {
            frameBuffer[j] = arc4random();
        }
        */

    }

    return noErr;
}

现在我想播放从someObject.anAudioBuffer复制到本地var buffer

的字节

我注意到代码的这一部分与播放音频

有关
/*
 UInt16 *frameBuffer = buffer.mData;
 for (int j = 0; j < inNumberFrames; j++) {
    frameBuffer[j] = arc4random();
 }
*/

现在arc4random用于播放静态噪音。尽我最大努力并在互联网上搜索我无法弄清楚如何播放我自己的字节以及这段代码b / w /* */

例如这条线的目的是什么?

UInt16 *frameBuffer = buffer.mData;

以及如何使用我自己的数据填充此frameBuffer

任何人都可以指导我。我的太多时间都浪费在这个看似微不足道的问题上。

如果需要,我可以提供更多细节。

期待等待......

2 个答案:

答案 0 :(得分:0)

你必须用mBuffer.mData [0]指向的内存(或数组)填充音频样本帧的完全inNumberFrames(无论你是否有这些样本)。您可以在噪声生成器中执行此操作,但不能在memcopy代码中执行此操作。

同样保持mDataByteSize不变,因为它是回调的输入,而不是inout。音频回调是需求,而不是可选请求。

答案 1 :(得分:0)

所以我找到了答案

这很简单,但我不知道读C指针数组。我所要做的就是:

 UInt16 *frameBuffer = buffer.mData;
 for (int j = 0; j < inNumberFrames; j++) {
    frameBuffer[j] = *(frameBuffer + j);
 }

虽然此UInt16 *frameBuffer = buffer.mData;使frameBuffer指向buffer.mData的起始索引,但以下

*(frameBuffer + j);是C读取下一个指针的方式。

写完frameBuffer[j] = *(frameBuffer + j);之后,我的音频流就像一个魅力。

很高兴知道这是否也有助于其他人。

here

找到C指针数组信息