我有一个在我的obj-c代码中收到的字节数组,如下所示:
void sendAudio(int length, Byte* byteArrPtr) {
bufferStream *newBuffer = [bufferStream getInstance];
for (int i=0; i<length;, i++)
{
uint16_t intData = OSReadBigInt16(byteArrPtr,2);
//How do I add intData to buffer here?
byteArrPtr++;
}
}
音频经过交织,采样率为44.1KHz,并以2048帧的 bundle 发送。
我的目标是使用渲染回调使这些音频数据在设备上播放,但是我不清楚如何用此数据填充音频缓冲区以及如何从缓冲区中提取我的remoteIO音频单元。我在SO上找到的最接近的东西是Setting up an Audio Unit format and render callback for interleaved PCM audio帖子,答案建议为帧数(在我的情况下为2048)预分配缓冲区,并在render回调中将AudioBufferList对象指向此新缓冲区。
我创建了一个缓冲区类,尝试从中读取和读取缓冲区类,如下所示:
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
@interface bufferStream : NSObject {
AudioQueueBufferRef *buffer;
}
@property (nonatomic,assign)AudioQueueBufferRef *buffer;
+(bufferStream*)getInstance;
@end
并在实现中:
#import "bufferStream.h"
@implementation bufferStream
@synthesize buffer;
static bufferStream *instance = nil;
+(bufferStream*)getInstance
{
@synchronized(self)
{
if(instance==nil)
{
instance = [bufferStream new];
}
}
return instance;
}
@end
我一直在坚持如何填充此缓冲区,因此可以在代码的其他地方从中提取缓冲区。我是否应该为此使用AudioBufferQueueRef?
最佳答案
AudioBufferQueueRef是指向作为结构的AudioQueueBuffer的指针。它是一种不透明类型,旨在与AudioQueueServices一起使用。 (这取决于您要执行的操作,这不是坏方法)。
AudioBufferQueueRef不是Objective-C类,因此不能这样对待。
如果沿着音频单元的路径前进,建议您创建自己的用户信息结构以处理所需的内容。 Apple文档提供了此示例。
我还建议您重新考虑您要实现的设计模式,因为Objective-C可能会对性能产生影响。尽可能将其保持在C或C++级别。
如果您正在寻求高级替代方法,请查看AVFoundation框架。我认为在AudioToolbox框架中找到AudioQueueServices是一个不错的选择。
关于ios - 从字节数组填充音频缓冲区并使用渲染回调播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20909920/