为什么此音频流基本说明导致"音频转换器新返回-50"错误?



这是我们用来设置AudioStreamBasicDescription (ASBD)的函数。整个类深受来自苹果的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位小端位数而不是浮点数设置的。

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

你的下面一行没有意义。

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启动的地方张贴更多代码

相关内容

  • 没有找到相关文章

最新更新