[SWIFT] Jouer un son précédemment enregistré

Bonjour tout le monde,

J'essaie d'ajouter une fonctionnalité pour faire des messages vocaux dans mon appli mais je bloque au moment de jouer le son..

Voici ma fonction pour enregistrer via le micro :

// Demande de permission - DEBUT
recordingSession.requestRecordPermission() { [unowned self] allowed in
     DispatchQueue.main.async {
               if allowed {
                        self.nomFichier = "audio_blablabla.m4a"
                        let audioURL = getWhistleURL(nomFichier: self.nomFichier)

                        let settings = [
                            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                            AVSampleRateKey: 12000,
                            AVNumberOfChannelsKey: 1,
                            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
                        ]

                        do {
                            self.whistleRecorder = try AVAudioRecorder(url: audioURL, settings: settings)
                            self.whistleRecorder.delegate = self as? AVAudioRecorderDelegate
                            self.whistleRecorder.record()
                        } catch {
                            // Erreur sur l'enregistrement 
                        }


               } else {
                        // Permission PAS OK
                    }
                }
       }
// Demande de permission - FIN

Pour stopper l'enregistrement :

whistleRecorder.stop()

Jusqu'ici, pas de soucis, j'ai bien un fichier qui se crée dans :

file:///private/var/mobile/Containers/Data/Application/294EAA89-3049-4315-BF35-C4F39819C624/Documents/audio_blablabla.m4a

Maintenant, je souhaiterai l'écouter..
Voici comment je m'y prend :

let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let url = NSURL(fileURLWithPath: path)
if let pathComponent = url.appendingPathComponent("audio_blabla.m4a") {
let filePath = pathComponent.path
let fileManager = FileManager.default
if fileManager.fileExists(atPath: filePath) { // je vérifie si le fichier existe
     // /var/mobile/Containers/Data/Application/2213B499-D0F7-4DC0-A94C-7DD371E6997C/Documents/audio_blabla.m4a
     print("FILE EXIST")
     let attr = try FileManager.default.attributesOfItem(atPath:filePath)
     fileSize = attr[FileAttributeKey.size] as! UInt64
     print(fileSize) // j'ai affiché sa taille pour vérifier qu'il n'était pas à zéro, j'obtiens : 20492 

     if let url = URL(string: filePath){
          do {
                print("Audio ok !");
                audioPlayer = try AVAudioPlayer(contentsOf: url)
          } catch {
                print("audio file error")
          }

          audioPlayer?.play()
          print("play ?")
     }

}
else {
     print("FILE NOT AVAILABLE")
}
}
else {
     print("FILE PATH NOT AVAILABLE")
}

Dans ma console, j'ai bien :

FILE EXIST
La taille du fichier audio (20492)
Audio ok !
play ?

Sauf que je n'ai aucun son qui sort :/
J'ai testé différentes méthodes, différents bout de code par ci par là pour me débloquer mais c'est toujours le même soucis, je ne peux pas réécouter le message vocal que je viens d'enregistrer.

Avez-vous une idée d'où ça peut venir ?
Une piste pour me débloquer ?

Merci de votre aide :)

Réponses

  • Question à la con mais si je demande c'est parce que c'est le genre de trucs qui m'arrivent: l'appareil n'est pas en silencieux ?

  • InsouInsou Membre
    janvier 2021 modifié #3

    Nan, j'y ai pensé aussi, j'ai même joué une vidéo de ma galerie pour être sur que le son fonctionne et que ce soit pas un défaut matériel ^^

  • LarmeLarme Membre
    janvier 2021 modifié #4

    Une chose qui m'énerve : Ne pas printer l'erreur dans un catch. Que ce soit en ne faisant rien dans le catch, ou en printant tout sauf l'erreur: print("audio file error") => print("audio file error: \(error)"), à minima.

    Maintenant, il y a un delegate à ton player, qui implémenterait audioPlayerDecodeErrorDidOccur(_:error:) ?
    Sinon, il faudrait regarder du côté du "catch" plus global des erreurs : Responding to Audio Session Interruptions.

    Enfin, il serait peut-être intéressant de récupérer le fichier sur ton Mac et regarder si tu peux le jouer dans VLC (par exemple).

  • @Larme a dit :
    Enfin, il serait peut-être intéressant de récupérer le fichier sur ton Mac et regarder si tu peux le jouer dans VLC (par exemple).

    C'était ma question stupide numéro 2 : t'es sûr que ton micro enregistre un truc ?

  • C'était ma question stupide numéro 2 : t'es sûr que ton micro enregistre un truc ?

    Quand je fais des vocaux sur WhatsApp, pas de soucis, j'ai bien le son.

    @Larme a dit :
    Une chose qui m'énerve : Ne pas printer l'erreur dans un catch. Que ce soit en ne faisant rien dans le catch, ou en printant tout sauf l'erreur: print("audio file error") => print("audio file error: \(error)"), à minima.

    D'habitude je print toujours l'erreur dans le catch, là c'est juste que c'était un c/c à la va vite ^^
    Mais si je passe dans le cas où j'ai une erreur, évidemment que je vais l'afficher pour voir où est le soucis :wink:

    Enfin, il serait peut-être intéressant de récupérer le fichier sur ton Mac et regarder si tu peux le jouer dans VLC (par exemple).

    Je viens de le faire et en effet, tout les fichiers .m4a font la même taille, peut importe si je parle 5 ou 10 secondes..
    J'ai donc envoyé le fichier sur le mac et impossible de le lire.

    Du coup, je ne comprend pas..
    Pourquoi il ne me retourne pas une erreur lors de l'enregistrement ?
    Je devrais passer dans le catch nan ?

    J'ai vérifié que j'avais bien la permission du micro mais est ce qu'il n'y a pas d'autres choses à configurer que j'aurai oublié ?

  • InsouInsou Membre
    janvier 2021 modifié #7

    Bon alors, j'ai trouvé le soucis pour enregistrer le son et ne plus avoir de fichier .m4a vide..

    Mon mac à un hub usb de branché, qui me permet d'avoir un 2eme écran et un port usb pour relier l'iPhone..
    Quand le hub usb est branché, il n'y a aucun son sur le mac, ça m'a jamais dérangé vu que je n'utilise pas le son.. sauf qu'apparement, il bloque tout les sons et meme le micro de l'iPhone !!!
    J'ai testé de faire un vocal en débranchant le hub usb, ça fonctionne nickel !

    Du coup, ça va peut-être résoudre mon soucis de son qui ne se lit pas maintenant que je n'ai plus de fichier .m4a vide ^^

    Je retourne a mes tests..

    Edit :
    Ah bah oui, ça fonctionne carrément mieux maintenant !
    Du coup, je ne sais pas pourquoi ça coupe le son avec le hub usb mais bon.. maintenant je le sais ^^

    Merci de votre aide :smiley:

  • Pour info, le son que j'enregistre était beaucoup trop bas lorsque je le ré-écoute..
    Aucune idée de pourquoi..

    Après plusieurs tests, je suis tombé sur cette source (https://github.com/venkatkukunuru/Audio-Recorder) qui fait parfaitement le job, le son est nickel lorsqu'on le ré-écoute.

Connectez-vous ou Inscrivez-vous pour répondre.