gpt4 book ai didi

iphone - 使用远程 I/O 进行录音,AudioUnitRender -50 返回码

转载 作者:行者123 更新时间:2023-12-03 18:57:55 24 4
gpt4 key购买 nike

我一直在开发 iOS 频率检测应用程序,但在使用麦克风的音频样本填充用户定义的 AudioBufferList 时遇到问题。

当我在 InputCallback 方法中调用 AudioUnitRender 时,返回代码为 -50。我相信这意味着我的参数之一无效。我猜这是 AudioBufferList,但我一直无法弄清楚它出了什么问题。我想我已经将其设置为与我在 ASBD 中指定的数据格式相匹配。

下面是我认为可能不正确的远程 I/O 设置和函数调用:

ASBD:

size_t bytesPerSample = sizeof(AudioUnitSampleType);
AudioStreamBasicDescription localStreamFormat = {0};
localStreamFormat.mFormatID = kAudioFormatLinearPCM;
localStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
localStreamFormat.mBytesPerPacket = bytesPerSample;
localStreamFormat.mBytesPerFrame = bytesPerSample;
localStreamFormat.mFramesPerPacket = 1;
localStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
localStreamFormat.mChannelsPerFrame = 2;
localStreamFormat.mSampleRate = sampleRate;

输入回调声明:

err = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_SetInputCallback, 
kAudioUnitScope_Input,
kOutputBus, &callbackStruct, sizeof(callbackStruct));

音频缓冲区列表声明:

// Allocate AudioBuffers
bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));
bufferList->mNumberBuffers = 1;
bufferList->mBuffers[0].mNumberChannels = 2;

bufferList->mBuffers[0].mDataByteSize = 1024;
bufferList->mBuffers[0].mData = calloc(256, sizeof(uint32_t));

输入回调函数:

AudioUnit rioUnit = THIS->ioUnit;
OSStatus renderErr;
UInt32 bus1 = 1;
renderErr = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, bus1, inNumberFrames, THIS->bufferList);

需要注意的几点:

  • 采样率 = 22050 Hz
  • 由于远程 I/O 数据的规范格式是 8.24 位定点,因此我假设每个样本为 32 位(或 4 个字节)。由于 unsigned int 为 4 个字节,我用它来分配我的音频缓冲区。
  • 如果我将音频数据流实现为 PassThru 而不是仅作为输入,我可以获得相同的代码来正确渲染音频。
  • 我已经看过 Michael Tyson's blog post在远程 I/O 上。没有看到任何与我正在做的不同的事情。

再次感谢,你们都很棒!

德米特里

最佳答案

如果每帧有 2 个 channel ,则不能将 bytesPerSample 作为帧的大小。由于术语有点令人困惑:

  • 样本是波形中给定位置的单个值
  • channel 是指与特定音频流相关的数据,即立体声的左/右 channel 、单声道的单 channel 等。
  • 包含波形中给定位置的所有 channel 的样本
  • 一个数据包包含一个或多个帧

所以基本上,您需要使用 bytesPerSample * mChannelsPerFrame 来表示 mBytesPerFrame,并使用 mBytesPerFrame * mFramesPerPacket 来表示 mBytesPerPacket >.

我还注意到您使用 32 位作为样本大小。我不确定您是否真的想这样做——通常,您想使用 16 位样本来录制音频。 16 和 32 位音频之间的声音差异对于大多数听众来说几乎是不可能听到的(一般 CD 都是在 44.1kHz、16 位 PCM 下进行母带处理),并且它将为您节省 50% 的 I/O 和存储成本。/p>

关于iphone - 使用远程 I/O 进行录音,AudioUnitRender -50 返回码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4374289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com