繁体   English   中英

从字节数组填充音频缓冲区并使用渲染回调播放

[英]filling an audio buffer from an array of bytes and playing using a render callback

我有一个在我的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帧的捆绑发送。

我的目标是使用渲染回调在设备上播放此音频数据,但是我不清楚如何用此数据填充音频缓冲区以及如何从缓冲区中提取我的remoteIO音频单元。 我在SO上找到的最接近的东西是这篇文章,它设置了音频单元格式并为交错的PCM音频提供了回调 ,其中答案建议为帧数(在我的情况下为2048)预分配一个缓冲区,并为渲染回调中的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音频队列使用拉模型,而不是推模型。 因此,您不会将数据直接推送到音频驱动程序。 相反,您的应用程序必须将数据临时保存到中间数据缓冲区(循环队列或fifo)中,然后返回到运行循环。 然后,当调用音频回调函数时,该函数可以从中间缓冲区(如果有)复制(拉出)所需的数据量,并更新其具有的参数(标志,指针或索引)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM