[英]Playing audio from AudioBuffer->mdata in AudioUnit playback callback
一整天以来,我一直在寻找并尝试解决以下问题的人们。 尚未成功
好的,所以我一直在使用Apple示例代码项目名称WiTap
使用NSInputStreams
和NSOutputStreams
通过wifi通过WiTap
通信两个设备,我已经能够成功传输数据(音频数据)黑白设备。
但是,在目标设备上,我接收数据并将其填充到音频缓冲区中,如下所示:
bytesRead = [self.inputStream read:anAudioBuffer.mData maxLength:anAudioBuffer.mDataByteSize];
而anAudioBuffer
本身声明如下
anAudioBuffer.mNumberChannels = 1;
anAudioBuffer.mDataByteSize = 512 * 2;
anAudioBuffer.mData = malloc( 512 * 2 );
现在,我从Apple的示例代码中,通过AudioUnit回调中的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
来播放。
谁能指导我。 我太多的时间都浪费在这个看似微不足道的问题上。
如果需要,我可以提供更多详细信息。
等待中...
您必须将mBuffer.mData [0]指向的内存(或数组)完全插入音频样本帧的inNumberFrames中(无论这些样本是否可用)。 您可以在噪声生成器中执行此操作,但不能在内存复制代码中执行此操作。
还要保留mDataByteSize不变,因为它是回调的输入,而不是inout。 音频回调是需求,而不是可选请求。
所以我找到了答案
这很简单,但是我不了解读取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);
我的音频流就像魅力一样。
我们将很高兴知道这是否对您有所帮助。
从这里找到C指针数组信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.