簡體   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