为什么此 AudioStreamBasicDescription 会导致 'AudioConverterNew returned -50' 错误?
Why is this AudioStreamBasicDescription causing a 'AudioConverterNew returned -50' error?
这是我们用来设置 AudioStreamBasicDescription (ASBD) 的函数。整个 class 深受 Apple 的 SpeakHere 示例应用程序的影响。
这是为了在 iOS 设备上录制(特别是 iPad Air,也在 iPhone 6 Plus 上测试过)。
启动 AudioQueue 缓冲区进行录音时,我在设备日志中收到 'AudioConverterNew returned -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]
获取系统当前可用的频道数。如果您只使用内置麦克风,它可以 return 1 或 2 个通道。如果你连接一个 USB 前置放大器,你可以有 4 个或 8 个或更多的输入通道可用。因此,根据可用输入通道的数量设置格式是没有意义的。 您通常将录音格式设置为单声道或立体声,并根据需要路由输入。
有时您想使用以下方式激活您的会话:
BOOL activated = [[AVAudioSession sharedInstance] setActive:YES error:&error];
NSLog(@"AVAudioSession activated %i",activated);
你上面设置的ASBD是可以的。我在我拥有的应用程序中对其进行了测试,当将其与 AudioUnitSetProperty 一起使用时,格式本身不会引发错误。 Post 启动 AudioQueue 的更多代码。
这是我们用来设置 AudioStreamBasicDescription (ASBD) 的函数。整个 class 深受 Apple 的 SpeakHere 示例应用程序的影响。
这是为了在 iOS 设备上录制(特别是 iPad Air,也在 iPhone 6 Plus 上测试过)。
启动 AudioQueue 缓冲区进行录音时,我在设备日志中收到 'AudioConverterNew returned -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]
获取系统当前可用的频道数。如果您只使用内置麦克风,它可以 return 1 或 2 个通道。如果你连接一个 USB 前置放大器,你可以有 4 个或 8 个或更多的输入通道可用。因此,根据可用输入通道的数量设置格式是没有意义的。 您通常将录音格式设置为单声道或立体声,并根据需要路由输入。
有时您想使用以下方式激活您的会话:
BOOL activated = [[AVAudioSession sharedInstance] setActive:YES error:&error];
NSLog(@"AVAudioSession activated %i",activated);
你上面设置的ASBD是可以的。我在我拥有的应用程序中对其进行了测试,当将其与 AudioUnitSetProperty 一起使用时,格式本身不会引发错误。 Post 启动 AudioQueue 的更多代码。