[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 ?
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 ^^
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émenteraitaudioPlayerDecodeErrorDidOccur(_: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).
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.
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
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é ?
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
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.