web-dev-qa-db-fra.com

AVAudioPlayer ne lit pas l'audio dans Swift

J'ai ce code dans une application Swift très simple à affichage unique dans ma ViewController:

var audioPlayer = AVAudioPlayer()

@IBAction func playMyFile(sender: AnyObject) {

    let fileString = NSBundle.mainBundle().pathForResource("audioFile", ofType: "m4a")
    let url = NSURL(fileURLWithPath: fileString)
    var error : NSError?
    audioPlayer = AVAudioPlayer(contentsOfURL: url, error: &error)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    if (audioPlayer.isEqual(nil)) {
        println("There was an error: (er)")
    } else {
        audioPlayer.play()
        NSLog("working")
    }

J'ai ajouté import AVFoundation et audioPlayer est une variable globale. Lorsque j'exécute le code, il imprime "travail", donc il passe sans erreur mais aucun son n'est joué. L'appareil n'est pas silencieux.

7
Kenneth

Il y a tellement de problèmes avec votre code que la méthode socratique échoue; il sera probablement plus facile de le jeter et de vous montrer:

var player : AVAudioPlayer! = nil // will be Optional, must supply initializer

@IBAction func playMyFile(sender: AnyObject?) {
    let path = NSBundle.mainBundle().pathForResource("audioFile", ofType:"m4a")
    let fileURL = NSURL(fileURLWithPath: path)
    player = AVAudioPlayer(contentsOfURL: fileURL, error: nil)
    player.prepareToPlay()
    player.delegate = self
    player.play()
}

Je n'ai pas pris la peine de vérifier les erreurs, mais vous pouvez vous planter s'il y a un problème.

Un dernier point, qui peut être pertinent ou non: tous les fichiers m4a ne sont pas lisibles. Un fichier fortement compressé, par exemple, peut échouer en silence (jeu de mots voulu).

17
matt

Voici un extrait de travail de mon projet Swift. Remplacez "audiofile" par votre nom de fichier.

    var audioPlayer = AVAudioPlayer()
    let audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("audiofile", ofType: "mp3"))
    audioPlayer = AVAudioPlayer(contentsOfURL: audioPath, error: nil)
    audioPlayer.delegate = self
    audioPlayer.prepareToPlay()
    audioPlayer.play()

Vous pouvez télécharger le code source de l'application Swift Audio Player entièrement fonctionnel à partir d'ici https://github.com/bpolat/Music-Player

4
bpolat

Il est important que AvPlayer soit membre de la classe et non dans la fonction donnée, sinon il sort de la portée ... :)

4
iHolm

Dans Swift Coding, en utilisant Try catch, ce problème va résoudre et lire le son pour moi et mon code ci-dessous,

var playerVal = AVAudioPlayer()

         @IBAction func btnPlayAction(sender: AnyObject) {
                let fileURL: NSURL = NSURL(string: url)!
                    let soundData = NSData(contentsOfURL: fileURL)

                    do {
                        playerVal = try AVAudioPlayer(data: soundData!)
                    }
                    catch {
                        print("Something bad happened. Try catching specific errors to narrow things down",error)
                    }

                    playerVal.delegate = self
                    playerVal.prepareToPlay()

                    playerVal.play()

              }
0
Iyyappan Ravi

Swift 3.0:

 import UIKit
    import AVFoundation

    class ViewController: UIViewController
    {
        var audioplayer = AVAudioPlayer()

        @IBAction func Play(_ sender: Any)
        {
            audioplayer.play()
        }
        @IBAction func Pause(_ sender: Any)
        {
            if audioplayer.isPlaying
            {
                audioplayer.pause()
            }
            else
            {

            }
        }
        @IBAction func Restart(_ sender: Any)
        {
            if audioplayer.isPlaying
            {
                audioplayer.currentTime = 0
                audioplayer.play()
            }
            else
            {
                audioplayer.play()
            }

        }
        override func viewDidLoad()
        {
            super.viewDidLoad()

            do
            {
                audioplayer = try AVAudioPlayer(contentsOf:URL.init(fileURLWithPath:Bundle.main.path(forResource:"bahubali", ofType: "mp3")!))
                audioplayer.prepareToPlay()

                var audioSession = AVAudioSession.sharedInstance()

                do
                {
                    try audioSession.setCategory(AVAudioSessionCategoryPlayback)
                }

                catch
                {

                }
            }
            catch
            {
                print (error)
            }

        }
     }   
0
ronak patel

J'ai utilisé le code ci-dessous dans mon application et cela fonctionne. J'espère que c'est utile.

var audioPlayer: AVAudioPlayer!
if var filePath = NSBundle.mainBundle().pathForResource("audioFile", ofType:"mp3"){

     var filePathUrl = NSURL.fileURLWithPath(filePath)
     audioPlayer = AVAudioPlayer(contentsOfURL: filePathUrl, error: nil)
     audioPlayer.play()
}else {
     println("Path for audio file not found")
}
0
Prashanth Ds

pour une raison quelconque (probablement un bug) Xcode ne peut pas lire certains fichiers de musique au format .m4a et .mp3, je vous recommande de les changer tous en fichiers .wav pour pouvoir les lire.

//top of your class
var audioPlayer = AVAudioPlayer

//where you want to play your sound
let Sound = NSURL(fileURLWithPath: Bundle.main.path(forResource: "sound", ofType: "wav")!)
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: Sound as URL)
        audioPlayer.prepareToPlay()
    } catch {
        print("Problem in getting File")
    }
    audioPlayer.play()
0
Anonymous
var audioPlayer = AVAudioPlayer()
var alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("KiepRongBuon", ofType: "mp3")!)
        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)
        var error:NSError?
        audioPlayer = AVAudioPlayer(contentsOfURL: alertSound, error: &error)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
0
William Kane
var audio: AVAudioPlayer = AVAudioPlayer()

@IBAction func playaudio(sender: AnyObject) //method for playing audio
{

    var audioPath = NSString(string: NSBundle.mainBundle().pathForResource("bus",       ofType: "mp3")!)

    var error: NSError? = nil

    //instantiate the player
    audio = AVAudioPlayer(contentsOfURL: NSURL(string: audioPath as String), error: &error)
    audio.prepareToPlay()
    audio.play()
}

override func viewDidLoad() {

    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

Et n'oubliez pas d'importer AVFoundation Framework.

0
Mehul D