2016-04-22 2 views
3

Ich benutze AVAudioEngine, um die Stimme des Benutzers zu erfassen und einige Effekte darauf anzuwenden.Wenn mit dem Mikrofon des Kopfhörers aufgenommen wird, geht alles gut. Aber wenn es darum geht, mit dem eingebauten Mikrofon des Telefons aufzunehmen und den Ton über den Kopfhörer abzuspielen, hat nur der Ohrhörer auf der linken Seite den Ton. Es scheint, dass das eingebaute Mikrofon nur über einen einzelnen Kanal verfügt. Wie kann ich dieses Problem beheben? Hier einige meines Code:IOS-Aufnahme mit eingebautem Mikrofon haben nur einen Kanal-Sound

func connectNode(){ 
    engine.connect(engine.inputNode!, to: reverbNode, format:reverbNode.outputFormatForBus(0)) 
    engine.connect(reverbNode, to: delayNode, format: delayNode.outputFormatForBus(0)) 
    engine.connect(delayNode, to: distortion, format: distortion.outputFormatForBus(0)) 
    engine.connect(distortion, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0)) 
    engine.connect(player, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0)) 
} 

func recordToFile(){ 
    setSessionRecord() 
    recordSetting[AVFormatIDKey] = NSNumber(unsignedInt: UInt32(kAudioFormatMPEG4AAC)) 
    recordSetting[AVNumberOfChannelsKey] = NSNumber(int: 2) 
    var file: AVAudioFile! 
    do{ 
    try file = AVAudioFile(forWriting: URLFor(fileName)!, settings: recordSetting) 
    }catch let error as NSError{ 
    print("error:\(error)") 
    } 
    engine.mainMixerNode.installTapOnBus(0, bufferSize: 1024, format: file.processingFormat) { (buffer, time) -> Void in 
    try! file.writeFromBuffer(buffer) 
    } 
} 

func playbackRecord(){ 
    setSessionPlayback() 
    var file:AVAudioFile! 
    file = try! AVAudioFile(forReading:URLFor(fileName)!) 
    let audioFormat = file.processingFormat 
    let audioFrameCount = UInt32(file.length) 
    let audioFileBuffer = AVAudioPCMBuffer(PCMFormat: audioFormat, frameCapacity: audioFrameCount) 
    try! file.readIntoBuffer(audioFileBuffer, frameCount: audioFrameCount) 
    player.scheduleBuffer(audioFileBuffer, atTime: nil, options: .Interrupts, completionHandler: {print(self.player.stop())}) 
    if(!player.playing){ 
    player.play() 
    }else{ 
    print("stop") 
    player.stop() 
    } 
} 

Antwort

1

ich einen Weg gefunden, diese issue.Just zu ändern, diese Methode zu fixieren dem Motor mit einem einzigen Kanal-Format zu geben, und dann wird alles in Ordnung sein.

func connectNode(){ 
    let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.PCMFormatFloat32, sampleRate: 44100.0, channels:AVAudioChannelCount(1), interleaved: false) 
    engine.connect(engine.inputNode!, to: reverbNode, format:format) 
    engine.connect(reverbNode, to: delayNode, format: format) 
    engine.connect(delayNode, to: distortion, format: format) 
    engine.connect(distortion, to: engine.mainMixerNode, format: format) 
    engine.connect(player, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0)) 
} 
Verwandte Themen