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