为啥此 AudioStreamBasicDescription 会导致“AudioConverterNew 返回 -50”错误?

Posted

技术标签:

【中文标题】为啥此 AudioStreamBasicDescription 会导致“AudioConverterNew 返回 -50”错误?【英文标题】:Why is this AudioStreamBasicDescription causing a 'AudioConverterNew returned -50' error?为什么此 AudioStreamBasicDescription 会导致“AudioConverterNew 返回 -50”错误? 【发布时间】:2015-09-11 17:44:40 【问题描述】:

这是我们用来设置 AudiostreamBasicDescription (ASBD) 的函数。整个班级深受 Apple 的 SpeakHere 示例应用程序的影响。

这适用于在 iOS 设备(特别是 iPad Air,也在 iPhone 6 Plus 上测试过)上录制。

启动 AudioQueue 缓冲区进行录制时,我在设备日志中收到“AudioConverterNew 返回 -50”错误。显然这只是意味着某些地方不正确?我猜我的 ASBD 有问题。

- (void)setupAudioFormat
 // setup AudioStreamBasicDescription
    memset(&mDataFormat, 0, sizeof(mDataFormat));

    int sampleSize = sizeof(float);

    AVAudioSession *session = [AVAudioSession sharedInstance];
    mDataFormat.mSampleRate = [session sampleRate]; //44100
    mDataFormat.mChannelsPerFrame = [session inputNumberOfChannels]; // why is this returning 0?

    if ( mDataFormat.mChannelsPerFrame <= 0 )
    
        mDataFormat.mChannelsPerFrame = 1; // mono
    

    mDataFormat.mFormatID = kAudioFormatLinearPCM;
    mDataFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsNonInterleaved;

    mDataFormat.mBitsPerChannel = 8 * sampleSize;
    mDataFormat.mBytesPerFrame = sampleSize * mDataFormat.mChannelsPerFrame;
    mDataFormat.mBytesPerPacket = mDataFormat.mBytesPerFrame;
    mDataFormat.mFramesPerPacket = 1;
    mDataFormat.mReserved = 0;

    NSLog(@"FORMAT sampleRate=%f, channels=%i, flags=%i, BPC=%i, BPF=%i", mDataFormat.mSampleRate, mDataFormat.mChannelsPerFrame, mDataFormat.mFormatFlags, mDataFormat.mBitsPerChannel, mDataFormat.mBytesPerFrame);

SpeakHere 示例应用程序也使用线性 PCM,但它使用带符号的 16 位 little-endian 而不是浮点数进行设置。

最终我需要将音频缓冲区数据作为浮点数组传递给其他东西。我是否必须将其更改为使用带符号的 16 位 little-endian 并将结果转换为浮点值?

【问题讨论】:

【参考方案1】:

您下面的行没有意义。

mDataFormat.mChannelsPerFrame = [session inputNumberOfChannels]; // why is this returning 0?

代码[session inputNumberOfChannels] 获取系统当前可用的通道数。如果您只使用内置麦克风,它可能会返回 1 或 2 个通道。如果您连接一个 USB 前置放大器,您可能有 4 个或 8 个或更多输入通道可用。因此,根据可用输入通道的数量来设置格式是没有意义的。 通常将录音格式设置为单声道或立体声,并根据需要路由输入。

在某些时候您想使用以下方式激活会话:

BOOL activated = [[AVAudioSession sharedInstance] setActive:YES error:&error];
NSLog(@"AVAudioSession activated %i",activated);

您在上面设置的 ASBD 没问题。我在我拥有的应用程序中对其进行了测试,当将其与 AudioUnitSetProperty 一起使用时,格式本身不会引发错误。在您启动 AudioQueue 的位置发布更多代码。

【讨论】:

问题是 AVAudioSession 激活。我猜会话返回 0 因为它没有处于活动状态。我已将其更改为单声道,但此代码是基于其他人的示例,我不确定他们为什么这样做。我猜有更多的代码需要处理,但是有很多可用的频道,但我再也找不到那个例子了。

以上是关于为啥此 AudioStreamBasicDescription 会导致“AudioConverterNew 返回 -50”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到此错误:“不支持此功能(数字商品)。”?

为啥我会收到此错误

为啥在运行此 OpenCV 程序时出现此异常?

为啥我收到此错误,responseSerializationFailed?

为啥 GoogleSignInAccount 会出现此错误?

为啥此代码给出错误