2015-03-03 1 views
-2

Comment utiliser le taux dans AVAudioEngine?Comment utiliser le taux dans AVAudioEngine

Voici mon code complet:

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

var audioEngine = AVAudioEngine() 
var myPlayer = AVAudioPlayerNode() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    if var filePath = NSBundle.mainBundle().pathForResource("music", ofType: "wav"){ 

     var filePathURL = NSURL.fileURLWithPath(filePath) 
     audioEngine.attachNode(myPlayer) 
     var audioFile = AVAudioFile(forReading: filePathURL, error: nil) 
     var audioError:NSError? 

     audioEngine.connect(myPlayer, to: audioEngine.mainMixerNode, format: audioFile.processingFormat) 

     myPlayer.scheduleFile(audioFile, atTime: nil, completionHandler: nil) 
     audioEngine.startAndReturnError(&audioError) 

    }else { 
     println("url not found") 

    } 

} 


@IBAction func playSound(sender: UIButton) { 

    myPlayer.rate = 0.5 
    myPlayer.play() 

} 

Ainsi, alors que je joue le son son de ne pas utiliser le taux du tout. En outre, comment puis-je réinitialiser la position une fois que j'ai terminé l'audio. AVAudioPlayer avait currentTime à utiliser pour réinitialiser la barre.

Édition1: Ceci est plutôt source de confusion si AVAudioPlayerNode n'a pas de classe à gérer, pourquoi est-ce que cela me permet d'utiliser le taux? Désolé complètement noob à la programmation.

Édition2: Vous pouvez l'utiliser avec l'aide de l'exemple de code de Matt. J'ai raté la ligne de sortie audio:

 var audioEngine = AVAudioEngine() 
     var myPlayer = AVAudioPlayerNode() 
     audioEngine.attachNode(myPlayer) 
     var changeAudioUnitTime = AVAudioUnitTimePitch() 

     changeAudioUnitTime.rate = audioChangeNumber 
     audioEngine.attachNode(changeAudioUnitTime) 
     audioEngine.connect(myPlayer, to: changeAudioUnitTime, format: nil) 
     audioEngine.connect(changeAudioUnitTime, to: audioEngine.outputNode, format: nil) 
     audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil) 
     audioEngine.startAndReturnError(nil) 
     audioPlayerNode.play() 

Merci à tous pour votre aide.

Répondre

2

Pour modifier le taux de AVAudioEngine, vous avez deux choix:

  • Do mélange 3D avec un AVAudioEnvironmentNode. Seul le AVAudioEnvironmentNode possède une propriété de protocole AVAudio3DMixing significative rate.

  • Transmettez la sortie du fichier via un noeud AVAudioUnitTimePitch et réglez son rate.

+0

je montre la deuxième approche ici: https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch14p655AVAudioEngineTest/AVAudioEngineTest/ViewController.swift – matt

+0

Matt, j'ai essayé votre code d'exemple en changeant seulement le taux et en attachant le noeud. Suivez-le en planifiant le fichier et en essayant de le lire. Il y a toujours une erreur "exception non interceptée de type NSException". J'ai donc vérifié mon storyboard pour voir s'il y avait des boutons ou des connexions non contrôlés. Il n'y en avait pas. J'ai donc essayé de supprimer la partie d'effet et de la rejouer. Cette partie fonctionne. –

+0

L'exemple fonctionne comme je l'ai écrit; ce que tu as fait dans ton code, je n'en ai aucune idée. Cependant, ce n'est pas pertinent. vous avez demandé pourquoi 'rate' ne fonctionnait pas et comment le faire fonctionner, et je vous l'ai dit. – matt