Possiedo un'istanza AVAudioPlayer che carica il suono in memoria con audioPlayer.prepareToPlay()
e, dopo alcuni, inizia a riprodurlo. Ho un problema che in circa dieci minuti dopo aver inserito lo sfondo, si perde dalla memoria e non sono in preparazione. Dopo quelle ore alimentate, non ho ancora la possibilità di eseguire prepareToPlay()
. Come lasciare quel suono precaricato in memoria per un lungo periodo? Sto preparando suono da riprodurre in applicationDidFinishLaunchingWithOptions
metodo:AVAudioPlayer ha precaricato le perdite di suono dalla memoria
let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(dispatchQueue, {[weak self] in
var audioSessionError: NSError?
let audioSession = AVAudioSession.sharedInstance()
NSNotificationCenter.defaultCenter().addObserver(self!, selector: "handleInterruption:", name: AVAudioSessionInterruptionNotification, object: nil)
audioSession.setActive(true, error: nil)
if (audioSession.setCategory(AVAudioSessionCategoryPlayback, error: &audioSessionError)) {
println("Successfully set the audio session")
} else {
println("Could not set the audio session")
}
let filePath = NSBundle.mainBundle().pathForResource("sound", ofType:"mp3")
let fileData = NSData(contentsOfFile: filePath!, options: .DataReadingMappedIfSafe, error: nil)
var error:NSError?
self!.audioPlayer = AVAudioPlayer(data: fileData, error: &error)
self!.audioPlayer?.numberOfLoops = -1
self!.audioPlayer?.delegate = self
if (self?.audioPlayer?.prepareToPlay() != false) {
println("Successfully prepared for playing")
} else {
println("Failed to prepare for playing")
}
})
Poi nel didReceiveRemoteNotification
Sto cercando di giocare in background: self.audioPlayer?.play()
, IT rendimenti true
. Probabilmente funziona, ma dopo circa 10 - 20 minuti non funziona. E nota che .play()
ora restituisce false
.
C'è un senso di disabilitare ARC (Automatic Reference Counting) per sbloccare e dealloc
audioPlayer
manualmente?Forse ho bisogno di utilizzare API di livello inferiore come
OpenAL
? Tuttavia non lo userò poiché è deprecato in iOS 9 e in seguito dovrò riscriverlo senzaOpenAL
.Altre idee? Forse ho bisogno di usare
Audio Units
conRemoteIO
? Se funzionerà, fornisci alcuni esempi per favore.Forse ci sono quadri di terze parti come
ObjectAL
- una facile implementazione diOpenAL
. Come so che è disponibile in iOS 9.
Questi metodi sono solo mie supposizioni. Ma la loro domanda principale rimane la stessa: Questi metodi funzioneranno dallo sfondo?
provato questo collegamento? http://stackoverflow.com/questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc –
Non sembra una risposta –
Disabilita ARC: http://stackoverflow.com/questions/6646052/how -can-i-disable-arc-for-a-single-file-in-a-project – d4Rk