- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用以下代码来初始化我的音频组件。
-(void) startListeningWithCoreAudio
{
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:&error];
if (error)
NSLog(@"error setting up audio session: %@", [error localizedDescription]);
[[AVAudioSession sharedInstance] setDelegate:self];
OSStatus status = AudioSessionSetActive(YES);
checkStatus(status);
// Find the apple mic
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
AudioComponent inputComponent = AudioComponentFindNext( NULL, &desc );
status = AudioComponentInstanceNew( inputComponent, &kAudioUnit );
checkStatus( status );
// enable mic output as our input
UInt32 flag = 1;
status = AudioUnitSetProperty( kAudioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, kInputBus, &flag, sizeof(flag) );
checkStatus(status);
// Define mic output audio format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 16000.0;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
status = AudioUnitSetProperty( kAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, kInputBus, &audioFormat, sizeof(audioFormat) );
checkStatus(status);
// Define our callback methods
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = recordingCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty( kAudioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, kInputBus, &callbackStruct, sizeof(callbackStruct) );
checkStatus(status);
// By pass voice processing
UInt32 audiobypassProcessing = [[NSUserDefaults standardUserDefaults] boolForKey:VOICE_BY_PASS_PROCESSING];
status = AudioUnitSetProperty(kAudioUnit, kAUVoiceIOProperty_BypassVoiceProcessing,
kAudioUnitScope_Global, kInputBus, &audiobypassProcessing, sizeof(audiobypassProcessing));
checkStatus(status);
// Automatic Gain Control
UInt32 audioAGC = [[NSUserDefaults standardUserDefaults]boolForKey:VOICE_AGC];
status = AudioUnitSetProperty(kAudioUnit, kAUVoiceIOProperty_VoiceProcessingEnableAGC,
kAudioUnitScope_Global, kInputBus, &audioAGC, sizeof(audioAGC));
checkStatus(status);
//Non Audio Voice Ducking
UInt32 audioDucking = [[NSUserDefaults standardUserDefaults]boolForKey:VOICE_DUCKING];
status = AudioUnitSetProperty(kAudioUnit, kAUVoiceIOProperty_DuckNonVoiceAudio,
kAudioUnitScope_Global, kInputBus, &audioDucking, sizeof(audioDucking));
checkStatus(status);
//Audio Quality
UInt32 quality = [[NSUserDefaults standardUserDefaults]integerForKey:VOICE_QUALITY];
status = AudioUnitSetProperty(kAudioUnit, kAUVoiceIOProperty_VoiceProcessingQuality,
kAudioUnitScope_Global, kInputBus, &quality, sizeof(quality));
checkStatus(status);
status = AudioUnitInitialize(kAudioUnit);
checkStatus(status);
status = AudioOutputUnitStart( kAudioUnit );
checkStatus(status);
UInt32 audioRoute = (UInt32)kAudioSessionOverrideAudioRoute_Speaker;
status = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRoute), &audioRoute);
checkStatus(status);
}
-(void) stopListeningWithCoreAudio
{
OSStatus status = AudioUnitUninitialize( kAudioUnit );
checkStatus(status);
status = AudioOutputUnitStop( kAudioUnit );
checkStatus( status );
// if(kAudioUnit)
// {
// status = AudioComponentInstanceDispose(kAudioUnit);
// checkStatus(status);
// kAudioUnit = nil;
// }
status = AudioSessionSetActive(NO);
checkStatus(status);
NSError *error = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategorySoloAmbient error:&error];
if (error)
NSLog(@"error setting up audio session: %@", [error localizedDescription]);
}
第一次使用效果很好。我的意思是 startListeningWithCoreAudio
由按钮按下事件调用。它可以很好地记录/处理音频。在其他事件中,我正在调用 stopListeningWithCoreAudio
来停止录制/处理音频。
当我再次尝试调用函数startListeningWithCoreAudio
时,问题来了。它为两个函数抛出错误。 AudioUnitInitialize
和 AudioOutputUnitStart
从 startListeningWithCoreAudio
调用。
谁能帮我看看这是什么问题?
最佳答案
我找到了解决方案。如果我们连续调用以下函数,就会产生问题。
extern OSStatus AudioUnitUninitialize(AudioUnit inUnit)
extern OSStatus AudioComponentInstanceDispose(AudioComponentInstance inInstance)
因此,我通过以下方式在主线程上调用了 dispose 方法。
[self performSelectorOnMainThread:@selector(disposeCoreAudio) withObject:nil waitUntilDone:NO];
-(void) disposeCoreAudio
{
OSStatus status = AudioComponentInstanceDispose(kAudioUnit);
kAudioUnit = nil;
}
问题解决了。因此,正确的顺序是停止记录、取消初始化记录器并在主线程上处理记录器。
关于iphone - AudioUnitInitialize 在初始化 AudioComponentInstance 时抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10599694/
在一个 iOS 应用程序项目中,我有一个音频单元(用于输入/输出)初始化代码(在设置各种属性、回调等之后)以: OSErr err = AudioUnitInitialize (self.audioU
我在 App Store 中有一个应用程序使用 AudioUnit 来录制音频。 大约每周一次,我看到一些用户在野外调用 AudioUnitInitialize 失败,错误代码为 561017449,
我正在尝试使用 iOS 中的 Audio Unit 进行录制。 我将 AudioComponentDescription 中的 componentSubType 设置为 kAudioUnitSubTy
我正在使用以下代码来初始化我的音频组件。 -(void) startListeningWithCoreAudio { NSError *error = nil; [[AVAudio
假设代码是: ... status = AudioUnitSetProperty( unit, kAudioUnitProperty_StreamFormat, kAudioU
我正在使用 VOIP 应用程序。该应用程序与 CallKit 一起工作正常。 如果在通话中触发警报,我将面临一个问题。每次当警报停止触发(音频中断结束)时,我们都会尝试在 AVAudioSession
我正在尝试使用以下代码从 Core Audio(远程 I/O 音频单元)获取麦克风输入: - (void)audioAU { enum : AudioUnitElement {
我正在使用 AudioUnit 从 TeamSpeak 服务器播放音频,但是当我在 iOS 模拟器上调用 AudioUnitInitialize 时,我不断收到 macOS 提示以允许麦克风即使我只想
我是一名优秀的程序员,十分优秀!