小编Car*_*ega的帖子

了解远程I/O AudioStreamBasicDescription(ASBD)

我需要帮助理解以下ASBD.这是分配给新实例的默认ASBD RemoteIO(我通过AudioUnitGetProperty(..., kAudioUnitProperty_StreamFormat, ...)RemoteIO音频单元上执行,在分配和初始化之后立即获得它).

Float64 mSampleRate        44100
UInt32  mFormatID          1819304813
UInt32  mFormatFlags       41
UInt32  mBytesPerPacket    4
UInt32  mFramesPerPacket   1
UInt32  mBytesPerFrame     4
UInt32  mChannelsPerFrame  2
UInt32  mBitsPerChannel    32
UInt32  mReserved          0
Run Code Online (Sandbox Code Playgroud)

问题是,不mBytesPerFrame应该8吗?如果每个通道有32位(4字节),每帧2个通道,那么每帧不应该是8个字节长(而不是4个)?

提前致谢.

signal-processing core-audio audio-recording audio-streaming audiounit

6
推荐指数
2
解决办法
980
查看次数

无法编写远程I/O渲染回调函数

我正在编写一个iOS应用程序,它从麦克风输入,通过高通滤波器音频单元运行,然后通过扬声器播放.我已经能够通过使用AUGraph API成功地做到这一点.在其中,我放置了两个节点:远程I/O单元和效果音频单元(kAudioUnitType_Effect,kAudioUnitSubType_HighPassFilter),并将io单元的输入元素的输出范围连接到效果单元的输入,效果节点的输出连接到io单元的输出元素输入范围.但是现在我需要根据处理过的音频样本做一些分析,所以我需要直接访问缓冲区.这意味着(如果我错了请纠正我)我不能再用来AUGraphConnectNodeInput在效果节点的输出和io单元的输出元素之间建立连接,并且必须为io单元的输出元素附加渲染回调函数,所以每当扬声器需要新样本时我都可以访问缓冲区.我已经这样做了,但是当我AudioUnitRender在渲染回调中调用该函数时,我得到-50错误.我相信我有一个ASBD在两个音频单元之间不匹配的情况,因为我在渲染回调中没有做任何事情(而AUGraph之前已经处理过它).这是代码:

AudioController.h:

@interface AudioController : NSObject
{
    AUGraph mGraph;
    AudioUnit mEffects;
    AudioUnit ioUnit;
}

@property (readonly, nonatomic) AudioUnit mEffects;
@property (readonly, nonatomic) AudioUnit ioUnit;

-(void)initializeAUGraph;
-(void)startAUGraph;
-(void)stopAUGraph;

@end
Run Code Online (Sandbox Code Playgroud)

AudioController.mm:

@implementation AudioController

…

static OSStatus renderInput(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{
    AudioController *THIS = (__bridge AudioController*)inRefCon;

    AudioBuffer buffer;

    AudioStreamBasicDescription fxOutputASBD;
    UInt32 fxOutputASBDSize = sizeof(fxOutputASBD);
    AudioUnitGetProperty([THIS mEffects], kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &fxOutputASBD, &fxOutputASBDSize);

    buffer.mDataByteSize = inNumberFrames …
Run Code Online (Sandbox Code Playgroud)

objective-c callback core-audio audiounit ios

5
推荐指数
1
解决办法
1844
查看次数

解码AudioStreamBasicDescription的mFormatFlags编号(ASBD.mFormatFlags)

我正在编写一个使用 CoreAudio 的音频单元 API 的 iOS 应用程序,并且在某个时刻我会进行调用AudioUnitGetProperty(audioUnit, kAudioUnitProperty_StreamFormat, ...)。此时我设置了一个断点来查看 ASBD,我发现该mFormatFlags字段是41. 问题是,我可以从该数字中解码实际的标志名称(例如kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagIsPacked | ...)吗?

多谢。

core-audio audio-recording audiounit ios ios-simulator

2
推荐指数
1
解决办法
1815
查看次数