- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个问题,导致我无法从设备(iPhone4)上的麦克风捕获输入信号。但是,代码在模拟器中运行良好。该代码最初采用 Apple 的 MixerHostAudio 类(来自 MixerHost 示例代码)。在我开始添加用于捕获麦克风输入的代码之前,它在设备和模拟器中都运行良好。想知道是否有人可以帮助我。提前致谢!
这是我的 inputRenderCallback 函数,它将信号馈送到混合器输入中:
static OSStatus inputRenderCallback (
void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData) {
recorderStructPtr recorderStructPointer = (recorderStructPtr) inRefCon;
// ....
AudioUnitRenderActionFlags renderActionFlags;
err = AudioUnitRender(recorderStructPointer->iOUnit,
&renderActionFlags,
inTimeStamp,
1, // bus number for input
inNumberFrames,
recorderStructPointer->fInputAudioBuffer
);
// error returned is -10876
// ....
}
这是我的相关初始化代码:现在我在混音器中只保留 1 个输入,因此混音器看起来多余,但在添加输入捕获代码之前工作正常。
// Convenience function to allocate our audio buffers
- (AudioBufferList *) allocateAudioBufferListByNumChannels:(UInt32)numChannels withSize:(UInt32)size {
AudioBufferList* list;
UInt32 i;
list = (AudioBufferList*)calloc(1, sizeof(AudioBufferList) + numChannels * sizeof(AudioBuffer));
if(list == NULL)
return nil;
list->mNumberBuffers = numChannels;
for(i = 0; i < numChannels; ++i) {
list->mBuffers[i].mNumberChannels = 1;
list->mBuffers[i].mDataByteSize = size;
list->mBuffers[i].mData = malloc(size);
if(list->mBuffers[i].mData == NULL) {
[self destroyAudioBufferList:list];
return nil;
}
}
return list;
}
// initialize audio buffer list for input capture
recorderStructInstance.fInputAudioBuffer = [self allocateAudioBufferListByNumChannels:1 withSize:4096];
// I/O unit description
AudioComponentDescription iOUnitDescription;
iOUnitDescription.componentType = kAudioUnitType_Output;
iOUnitDescription.componentSubType = kAudioUnitSubType_RemoteIO;
iOUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
iOUnitDescription.componentFlags = 0;
iOUnitDescription.componentFlagsMask = 0;
// Multichannel mixer unit description
AudioComponentDescription MixerUnitDescription;
MixerUnitDescription.componentType = kAudioUnitType_Mixer;
MixerUnitDescription.componentSubType = kAudioUnitSubType_MultiChannelMixer;
MixerUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;
MixerUnitDescription.componentFlags = 0;
MixerUnitDescription.componentFlagsMask = 0;
AUNode iONode; // node for I/O unit
AUNode mixerNode; // node for Multichannel Mixer unit
// Add the nodes to the audio processing graph
result = AUGraphAddNode (
processingGraph,
&iOUnitDescription,
&iONode);
result = AUGraphAddNode (
processingGraph,
&MixerUnitDescription,
&mixerNode
);
result = AUGraphOpen (processingGraph);
// fetch mixer AudioUnit instance
result = AUGraphNodeInfo (
processingGraph,
mixerNode,
NULL,
&mixerUnit
);
// fetch RemoteIO AudioUnit instance
result = AUGraphNodeInfo (
processingGraph,
iONode,
NULL,
&(recorderStructInstance.iOUnit)
);
// enable input of RemoteIO unit
UInt32 enableInput = 1;
AudioUnitElement inputBus = 1;
result = AudioUnitSetProperty(recorderStructInstance.iOUnit,
kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input,
inputBus,
&enableInput,
sizeof(enableInput)
);
// setup mixer inputs
UInt32 busCount = 1;
result = AudioUnitSetProperty (
mixerUnit,
kAudioUnitProperty_ElementCount,
kAudioUnitScope_Input,
0,
&busCount,
sizeof (busCount)
);
UInt32 maximumFramesPerSlice = 4096;
result = AudioUnitSetProperty (
mixerUnit,
kAudioUnitProperty_MaximumFramesPerSlice,
kAudioUnitScope_Global,
0,
&maximumFramesPerSlice,
sizeof (maximumFramesPerSlice)
);
for (UInt16 busNumber = 0; busNumber < busCount; ++busNumber) {
// set up input callback
AURenderCallbackStruct inputCallbackStruct;
inputCallbackStruct.inputProc = &inputRenderCallback;
inputCallbackStruct.inputProcRefCon = &recorderStructInstance;
result = AUGraphSetNodeInputCallback (
processingGraph,
mixerNode,
busNumber,
&inputCallbackStruct
);
// set up stream format
AudioStreamBasicDescription mixerBusStreamFormat;
size_t bytesPerSample = sizeof (AudioUnitSampleType);
mixerBusStreamFormat.mFormatID = kAudioFormatLinearPCM;
mixerBusStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
mixerBusStreamFormat.mBytesPerPacket = bytesPerSample;
mixerBusStreamFormat.mFramesPerPacket = 1;
mixerBusStreamFormat.mBytesPerFrame = bytesPerSample;
mixerBusStreamFormat.mChannelsPerFrame = 2;
mixerBusStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
mixerBusStreamFormat.mSampleRate = graphSampleRate;
result = AudioUnitSetProperty (
mixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
busNumber,
&mixerBusStreamFormat,
sizeof (mixerBusStreamFormat)
);
}
// set sample rate of mixer output
result = AudioUnitSetProperty (
mixerUnit,
kAudioUnitProperty_SampleRate,
kAudioUnitScope_Output,
0,
&graphSampleRate,
sizeof (graphSampleRate)
);
// connect mixer output to RemoteIO
result = AUGraphConnectNodeInput (
processingGraph,
mixerNode, // source node
0, // source node output bus number
iONode, // destination node
0 // desintation node input bus number
);
// initialize AudioGraph
result = AUGraphInitialize (processingGraph);
// start AudioGraph
result = AUGraphStart (processingGraph);
// enable mixer input
result = AudioUnitSetParameter (
mixerUnit,
kMultiChannelMixerParam_Enable,
kAudioUnitScope_Input,
0, // bus number
1, // on
0
);
最佳答案
首先,应该注意的是,错误代码-10876对应于名为kAudioUnitErr_NoConnection
的符号。您通常可以通过谷歌搜索错误代码号和术语 CoreAudio 来找到这些内容。这应该暗示您要求系统渲染到未正确连接的 AudioUnit。
在渲染回调中,您将 void*
用户数据转换为 recorderStructPtr
。我假设当您调试此代码时,此转换返回一个非空结构,其中包含您的实际音频单元的地址。但是,您应该使用传入渲染回调(即 inputRenderCallback
函数)的 AudioBufferList
来渲染它。其中包含您需要处理的系统样本列表。
关于iphone - iOS - AudioUnitRender 在设备上返回错误 -10876,但在模拟器中运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5502170/
最近在看aurioTouch。但是我看不懂这句话: OSStatus err = AudioUnitRender (THIS-> rioUnit, ioActionFlags, inTimeStamp
我遇到了另一个 iOS 模拟器错误。我的问题是,是否有一些解决方法? 错误是这样的: 加载苹果的 AurioTouch 示例项目。 并简单地打印出渲染回调(在aurioTouchAppDelegate
当耳机插入 iOS 设备时,我想直接向扬声器播放录制的音频。 我所做的是在 AURenderCallback 函数中调用 AudioUnitRender,以便将音频数据写入 AudioBuffer 结
我有一个音乐制作应用程序,它使用 AUSampler 和 AURemoteIO 单元来播放用户定义的音符。我遇到一个问题,在使用一段时间后,对采样器上的 AudioUnitRender 的调用永远不会
我有一个配置了 AVAudioSessionCategoryPlayAndRecord 的 RemoteIO 单元。我发现其中有一些奇怪的行为。我打开应用程序,并在 audioUnit 完全初始化之前
我在 AudioUnitRender 调用中收到错误 -50。我的音频单元只是一个从麦克风获取样本的 RemoteIO 单元。错误-50是什么意思? let status = AudioUnitR
我正在从事一个项目,我在其中使用了 AudioUnitRender,它在模拟器中运行良好,但在设备中出现 -50 错误。 如果有人遇到过类似的问题,请给我一些解决方案。 RIOInterface* T
我遇到了一个问题,导致我无法从设备(iPhone4)上的麦克风捕获输入信号。但是,代码在模拟器中运行良好。该代码最初采用 Apple 的 MixerHostAudio 类(来自 MixerHost 示
我正在尝试使用 AudioUnit Render 进行离线渲染,但我没有看到哪个参数有误。可能是缓冲的大小。 我正在使用 swift 和 core audio 来解决这个问题,这是我从 Generic
在以下上下文中,我从 AudioUnitRender 收到错误 -50(无效参数)。我正在使用这个 Pitch Detector示例应用程序作为我的起点,它工作正常。我的项目中唯一的主要区别是我还使用
我一直在开发 iOS 频率检测应用程序,但在使用麦克风的音频样本填充用户定义的 AudioBufferList 时遇到问题。 当我在 InputCallback 方法中调用 AudioUnitRend
我们正在使用 AudioUnits 输入回调来处理传入缓冲区。音频单元设置主要取自 https://github.com/robovm/apple-ios-samples/blob/master/au
我正在尝试在 Swift 中将 MIDI 文件转换为音频文件 (.m4a)。 现在我正在使用 MIKMIDI作为排序和播放 MIDI 文件的工具,但是它不包括将播放保存到文件中的功能。 MIKMID
我是一名优秀的程序员,十分优秀!