我有一个iOS应用程序,可以同时播放不同的音效并记录音频。目前应用程序的目的并不重要,但我遇到了关于iOS自带音效的问题。
为了播放声音效果,我使用来自CocosDenshion API的SimpleAudioEngine(它使用AVAudioPlayer,据我所见)。这些音效已经预加载好了,它们可以正常工作(实际上我在按钮、滚动等方面进行了播放)。以下是播放音效的代码:
在willFinishLaunchingWithOptions方法中:
[[SimpleAudioEngine sharedEngine] preloadEffect:@"sound.wav"];
在其他需要玩耍的方法中:[[SimpleAudioEngine sharedEngine] playEffect:@"sound.wav"];
并没有什么惊奇的事情发生,但同时我正在使用AVCaptureSession
API录制来自内置麦克风的噪音。捕获会话代码来自在网上找到的示例之一。
AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
captureSession = [[AVCaptureSession alloc] init];
NSError *error = nil;
captureAudioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];
if ([captureSession canAddInput: captureAudioDeviceInput])
{
[captureSession addInput:captureAudioDeviceInput];
}
captureAudioDataOutput = [AVCaptureAudioDataOutput new];
if ([captureSession canAddOutput:captureAudioDataOutput])
{
[captureSession addOutput:captureAudioDataOutput];
}
// Create a serial dispatch queue and set it on the AVCaptureAudioDataOutput object
dispatch_queue_t audioDataOutputQueue = dispatch_queue_create("AudioDataOutputQueue", DISPATCH_QUEUE_SERIAL);
[captureAudioDataOutput setSampleBufferDelegate:self queue:audioDataOutputQueue];
dispatch_release(audioDataOutputQueue);
[captureSession startRunning];
这段代码的两个部分单独运行都没有问题。但当它们同时激活时,其中一个会影响到另一个。例如:麦克风读取数据时没有问题,直到播放某个声音效果时。我找到了一个解决方法,可以通过激活 mixWithOthers
类别来实现,具体方法如下:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
UInt32 doSetProperty = 1;
AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty);
[[AVAudioSession sharedInstance] setActive: YES error: nil];
在创建AVCaptureDevice
和AVCaptureSession
之前,需要完成此步骤。应用程序正常工作,声音播放且麦克风读取数据。硬件按钮也适用于CocosDenshion SimpleAudioEngine
(静音和音量)。
但是,显然应用程序有一个错误。
当禁用静音并播放声音时,文本框上的iOS键盘点击声音不会播放。我希望点击声音能够播放。
我已经调试了代码,并且显然与音频会话设置有关。如果我将类别设置为AVAudioSessionCategorySoloAmbient
,则会播放点击声音,但音量非常低(音量已经最大化,应用程序声音播放得很好)。这会导致另一个问题,SoloAmbient会取消我的CaptureSession,这是可以理解的。
我正在iPhone 5上测试应用程序,但模拟器上也发生同样的事情。
那么,我的设置有什么问题?如何修复设置以使我保持所有音频会话活动并保持iOS系统声音?
谢谢!