2014-11-14 64 views
1

我需要做這樣的事情。 我的應用程序使用AVCapturesession進行錄製,但它應該能夠播放帶有我玩過的背景音樂的實時Feed。只有背景音樂的AVCaptureSession

記住我能夠播放背景音樂與AVCapturesession,但問題是,它也涉及到周圍環境的聲音。

這裏是audiosession類我使用

 AudioSessionInitialize(NULL, NULL, NULL, self); 

    // //set the audio category 
    UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
    AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

    // mix with others!! this allows using AVCaptureSession and AusioSession simultaniously 
    UInt32 doSetProperty = 1; 
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); 

    AudioSessionSetActive(YES); 

我已經嘗試了類的幾乎所有的組合,但我沒能獲得所需的輸出, SoloAmbient和環境不播放聲音都沒有。

我也嘗試禁用AVCapturesession的audioinput,但它沒有幫助。

+0

檢查這個答案,我相信會幫助你:http://stackoverflow.com/a/28026142/1381708 – 2015-01-19 17:58:51

回答

1

您必須移除表示麥克風的AVCaptureInput設備。

AVCaptureSession *currentSession = self.currentSession; 
for(AVCaptureInput *input in currentSession.inputs) { 

    for (AVCaptureInputPort *port in input.ports) { 
     if ([[port mediaType] isEqual:AVMediaTypeAudio]) { 
      [currentSession removeInput:input]; 
      break; 
     } 
    } 
} 

現在設置您的音頻作爲這樣的事情: 您可以通過循環AVCaptureSession實例,做這樣的事情做到這一點

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionMixWithOthers|AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]; 
NSError *activationError = nil; 
BOOL success = [session setActive: YES error: &activationError]; 

SWIFT 3

let currentSession = self.currentSession 

for input in currentSession.inputs as! [AVCaptureInput] { 
    for port in input.ports as! [AVCaptureInputPort] { 
    if port.mediaType == AVMediaTypeAudio { 
     currentSession.removeInput(input) 
     break 
    } 
    } 
} 

do { 
    let session = AVAudioSession.sharedInstance() 
    try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [AVAudioSessionCategoryOptions.mixWithOthers, AVAudioSessionCategoryOptions.defaultToSpeaker]) 
    try session.setActive(true) 
} catch { 

}