iOS5 Effect Units应该使用啥流格式

Posted

技术标签:

【中文标题】iOS5 Effect Units应该使用啥流格式【英文标题】:What stream format should iOS5 Effect Units useiOS5 Effect Units应该使用什么流格式 【发布时间】:2012-01-29 20:35:33 【问题描述】:

我正在尝试使用低通滤波器 AU。将流格式设置为过滤器单元时,我不断收到 kAudioUnitErr_FormatNotSupported (-10868) 错误,但如果我只使用远程 IO 单元,则没有错误。

我使用的流格式是(更新):

myASBD.mSampleRate = hardwareSampleRate;
myASBD.mFormatID = kAudioFormatLinearPCM;      
myASBD.mFormatFlags = kAudioFormatFlagIsSignedInteger;
myASBD.mBitsPerChannel = 8 * sizeof(float);
myASBD.mFramesPerPacket = 1;                                          
myASBD.mChannelsPerFrame = 1;           
myASBD.mBytesPerPacket = sizeof(float) * myASBD.mFramesPerPacket;                                                                            
myASBD.mBytesPerFrame = sizeof(float) * myASBD.mChannelsPerFrame;  

我正在像这样设置过滤器流:

 // Sets input stream type to ASBD
 setupErr = AudioUnitSetProperty(filterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &myASBD, sizeof(myASBD));
 NSLog(@"Filter in: %i", setupErr);

 //NSAssert(setupErr == noErr, @"No ASBD on Finput");


//Sets output stream type to ASBD
setupErr = AudioUnitSetProperty(filterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &myASBD, sizeof(myASBD));
NSLog(@"Filter out: %i", setupErr);
NSAssert(setupErr == noErr, @"No ASBD on Foutput");

【问题讨论】:

【参考方案1】:

ios 过滤器音频单元的规范格式是 8.24 定点(线性 PCM),即每声道 32 位,而不是 16 位。

【讨论】:

我已经尝试使用 32 位通道,但仍然遇到流格式错误。我在其他地方被告知,iOS5 中的内置 AU 效果也不使用规范格式。我尝试使用 AudioUnitGetProperty 从过滤器单元获取流格式,但每次尝试时都会收到错误消息。使用渲染回调并只使用当前的 ASBD 会更好吗? 你设置的类型是定点还是浮点?这是 Mac 上的规范格式与 iOS 上的一个区别。 我已经更改了它,所以我没有使用浮点数,但我仍然收到错误。我不确定我是否正确设置了过滤器 ASBD,因为这是我得到错误的地方。【参考方案2】:

混响单元使用什么格式???我在尝试记录缓冲区时遇到奇怪的错误......关于这个主题的任何消息?

【讨论】:

【参考方案3】:

试试这个规范格式。

size_t bytesPerSample = sizeof (AudioUnitSampleType); //Default is 4 bytes
myASBD.mSampleRate        = hardwareSampleRate;
myASBD.mFormatID          = kAudioFormatLinearPCM;
myASBD.mFormatFlags       = kAudioFormatFlagsAudioUnitCanonical; //Canonical AU format
myASBD.mBytesPerPacket    = bytesPerSample;
myASBD.mFramesPerPacket   = 1;
myASBD.mBytesPerFrame     = bytesPerSample;
myASBD.mChannelsPerFrame  = 2;  //Stereo
myASBD.mBitsPerChannel    = 8 * bytesPerSample;  //32bit integer

您需要确保统一配置所有 AudioUnits ASBD。

如果您正在进行繁重的音频处理,浮动(iOS5 支持)也不是一个坏主意。

size_t bytesPerSample     = sizeof (float); //float is 4 bytes
myASBD.mSampleRate        = hardwareSampleRate;
myASBD.mFormatID          = kAudioFormatLinearPCM;
myASBD.mFormatFlags       = kAudioFormatFlagIsFloat;
myASBD.mBytesPerPacket    = bytesPerSample;
myASBD.mFramesPerPacket   = 1;
myASBD.mBytesPerFrame     = bytesPerSample;
myASBD.mChannelsPerFrame  = 2;
myASBD.mBitsPerChannel    = 8 * bytesPerSample;  //32bit float

【讨论】:

以上是关于iOS5 Effect Units应该使用啥流格式的主要内容,如果未能解决你的问题,请参考以下文章

警告:数组或迭代器中的每个孩子都应该有一个唯一的“key”道具。检查`Units`的渲染方法

redux-effect

在ngrx/effect中访问存储的正确方法

获取IOS5当前音量

我应该在 iOS 5 中使用哪个 FB SDK 版本?

iPad:iOS5 的 Popover 示例