2017-08-19 2 views
0

Le code suivant fonctionne pour les fichiers audio de courte durée sur tous mes appareils (iPhone, Apple Watch, Simulator):AVAudioPCMBuffer - lire (dans le tampon: AVAudioPCMBuffer) crash de mémoire? (Dépassement de mémoire tampon)

let file = try! AVAudioFile(forReading: url!) let format = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: file.fileFormat.sampleRate, channels: file.fileFormat.channelCount, interleaved: false) let buf = AVAudioPCMBuffer(pcmFormat: format!, frameCapacity: UInt32(file.length)) try! file.read(into: buf!)

L'accident se produit à try! file.read(into: buf!) Cependant essayer de lire un 5 min par exemple, un long fichier audio provoque un crash sur mon Apple Watch (bien que fonctionne sur l'Apple Watch Simulator). Avec Program ended with exit code: 0.

En regardant les outils de débogage, il est évident que ce processus est beaucoup plus lourd sur l'Apple Watch qu'un iPhone. J'ai essayé de l'exécuter sur différents threads, fond, etc en vain.

Je sais que je pourrais envoyer le tampon à l'iPhone pour le traitement, mais je voudrais voir (même si cela prend un peu plus de temps) si je peux lire dans le tampon strictement de la montre.

Répondre

0

5 minutes d'audio mono LPCM float32 à 44,1 kHz seraient de 5 * 60 * 44100 * 4 octets, soit environ 53 Mo. Double que pour la stéréo. Je ne sais pas quelles sont les limites de mémoire de la montre, mais je pense que vous les excédez.

+0

Oui c'est en fait 2 canaux audio, dans le débogueur la montre atteint environ 70-80 Mo d'utilisation de la mémoire, puis se bloque. Y at-il de toute façon que je pourrais atténuer la charge sur l'Apple Watch? – devone

+0

Qu'essayez-vous de faire? Avez-vous vraiment besoin de charger 5 minutes d'audio à la fois? Ou décompressez-vous? –

+0

Je charge le tampon dans - readFile.arrayValues ​​= Array (UnsafeBufferPointer (début: buf! .floatChannelData? [0], compte: Int (buf! .frameLength))) à partir de là Je traite les points pour créer une forme d'onde audio . Je dois le faire de cette façon, parce que les moyens plus faciles de le faire ne sont pas des cadres disponibles sur watchOS. – devone