自定义音频会话的iOS系统声音

10

我有一个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];

在创建AVCaptureDeviceAVCaptureSession之前,需要完成此步骤。应用程序正常工作,声音播放且麦克风读取数据。硬件按钮也适用于CocosDenshion SimpleAudioEngine(静音和音量)。

但是,显然应用程序有一个错误。

当禁用静音并播放声音时,文本框上的iOS键盘点击声音不会播放。我希望点击声音能够播放。

我已经调试了代码,并且显然与音频会话设置有关。如果我将类别设置为AVAudioSessionCategorySoloAmbient,则会播放点击声音,但音量非常低(音量已经最大化,应用程序声音播放得很好)。这会导致另一个问题,SoloAmbient会取消我的CaptureSession,这是可以理解的。

我正在iPhone 5上测试应用程序,但模拟器上也发生同样的事情。

那么,我的设置有什么问题?如何修复设置以使我保持所有音频会话活动并保持iOS系统声音?

谢谢!


你尝试过将类别设置为PlayAndRecord吗?如果你想同时播放和录制,你需要这样做。 - maroux
在提问之前,我已经尝试过了。PlayAndRecord 类别会使声音以较低的音量播放,但它并不能恢复丢失的键盘声音。 - Legoless
1个回答

1

好观点,我必须说。但是我想播放点击声。我已经实现了您建议的解决方法,但还是谢谢您的答复。 - Legoless
1
你上面提供的链接检查你的问题已经失效了。 - Sani Elfishawy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接