2013-03-21 100 views
10

我有一個iOS應用程序,可以同時播放不同的音頻效果並錄製音頻。該應用程序的目的目前並不重要,但我遇到了股票iOS音效的問題。自定義音頻會話的IOS系統聲音

爲了發揮效果,我使用了SimpleAudioEngineCocosDenshion API(它使用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(靜音和音量)上工作。

但顯然,該應用程序有一個錯誤。

當禁用靜音並且應用正在播放聲音時,不會播放TextField上的iOS鍵盤單擊聲音。我想要點擊聲音播放。

我已經調試了一下代碼,顯然它與音頻會話設置有關。如果我將該類別設置爲AVAudioSessionCategorySoloAmbient,則會播放點擊聲音,但音量很低(音量最大,應用程序聲音最大音量播放很好)。 它給出了另一個問題,SoloAmbient取消了我的CaptureSession,這是可以理解的。

我正在測試iPhone 5上的應用程序,但同樣的事情也發生在模擬器上。

那麼,我在做什麼錯誤的設置?我怎樣才能修復這些設置,使我的所有音頻會話保持活動狀態並保持iOS系統的聲音?

謝謝!

+0

您是否嘗試將類別設置爲PlayAndRecord?如果你想同時播放和錄製,你需要這樣做。 – Mar0ux 2013-03-31 13:02:55

+0

在提出問題之前,我已經嘗試過。 PlayAndRecord類別使聲音以較低的音量播放,但它不**帶回丟失的鍵盤聲音。 – Legoless 2013-04-01 11:24:18

回答

1

看看我的問題在這裏:https://stackoverflow.com/questions/15680503/how-to-get-the-audio-level-of-the-microphone-without-disabling-system-sounds

有不幸的是沒有答案。系統聲音在錄製過程中默認處於禁用狀態。我希望這是爲了防止他們被錯誤記錄,這在大多數情況下會是你想要的。

您可以實施UITextFieldDelegate協議,並且每次調用textField:shouldChangeCharactersInRange:replacementString:時都可以自行點擊。

+0

好的,我必須說。不過,我想要點擊播放。我已經實施了你建議的解決方法,但是感謝你的回答。 – Legoless 2013-06-19 15:36:02

+1

你有上面的鏈接來檢查你的問題是壞的。 – 2014-05-15 22:42:33