2015-02-04 2 views
1

오디오 장치 효과 (AVAudioUnitEffect)가있는 장치의 내장 마이크 (AVAudioInputNode)에서 오디오를 처리하고 싶습니다. 예를 들어 AVAudioUnitReverb을 사용하고 있습니다. AVAudioUnitReverb을 연결하면 응용 프로그램이 충돌하고 있습니다. AVAudioEngine을 사용하여 AVAudioUnitEffect에 AVAudioInputNode 연결

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    let audioEngine = AVAudioEngine() 
    let unitReverb = AVAudioUnitReverb() 

    var inputNode: AVAudioInputNode! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     inputNode = audioEngine.inputNode 
     audioEngine.attachNode(unitReverb) 

     let inputFormat = inputNode.inputFormatForBus(0) 
     audioEngine.connect(inputNode, to: unitReverb, format: inputFormat) 

     // This line is crashing the application! 
     // With this error "AVAudioNode.mm:521: AUSetFormat: error -10868" 
     audioEngine.connect(unitReverb, to: audioEngine.outputNode, format: inputFormat) 

     audioEngine.startAndReturnError(nil) 
    } 

} 

나는 리버브를 무시하고 audioEngine.outputNode에 직접 inputNode를 연결하면 나는 아무 문제가 없지만, 그때 리버브가 없다 :

audioEngine.connect(inputNode, to: audioEngine.outputNode, format: inputFormat)

내가 잘못하고있는 중이 야 무엇을?

업데이트

나는 실수로 내 Apple EarPods with Remote and Mic이 연결되어있을 때 위의 코드는 응용 프로그램을 충돌 것을 발견했다. 기기의 내장 마이크를 사용할 때 문제가 없습니다. 그렇다면 왜 내 헤드폰의 마이크가 응용 프로그램을 충돌 시키지만, AVAudioUnitEffect을 사용할 때만 가능합니까?

답변

3

시행 착오 후에 형식 인수를 변경하면이 문제가 해결 된 것으로 보입니다. 수정 된 코드는 다음과 같습니다.

let format = unitReverb.inputFormatForBus(0) 
audioEngine.connect(inputNode, to: unitReverb, format: format) 
audioEngine.connect(unitReverb, to: audioEngine.outputNode, format: format) 
+0

내 생명을 구할 ..! :) –