안녕하세요.swift AVFoundation에서 오디오 메모리 문제가 발생했습니다.
필자는 지정된 피치로 오디오를 재생하는이 기능을 가지고 있습니다. NStimer에 의해 호출되어 1 초에 1 번 재생됩니다. (A SoundPlayer 클래스에 포함 된 기능과 다음 NStimer 설치와의 ViewController에서 사용)
func playPitchedAudio(audioFile: AVAudioFile, pitch: Float){
audioEngine.stop()
audioEngine.reset()
let audioPlayerNode = AVAudioPlayerNode()
let changePitchEffect = AVAudioUnitTimePitch()
changePitchEffect.pitch = pitch
audioEngine.attachNode(audioPlayerNode)
audioEngine.attachNode(changePitchEffect)
audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil)
audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil)
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
do {
try audioEngine.start()
} catch {
print("error")
}
audioPlayerNode.play()
}
이 잘 실행하지 않고 작동하지만 메모리에의 호출마다 몇 메가 바이트를 추가하고 결코 공간을 되 찾는다. 메모리 누수에 대한 조사를했지만 내 구체적인 시나리오에 도움이되는 것을 찾을 수 없으므로 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.
새 노드와 TimePitch를 호출 할 때마다 함수를 포함하는 클래스로 이동했지만 "libC++ abi.dylib : NSException 유형의 catch되지 않는 예외로 종료" 사운드가 두 번째로 재생하려고 시도 할 때 오류가 발생합니다.
도움을 주시면 감사하겠습니다.
여분의 것들. (이 참조되지 않기 때문에) 발표 될 수 없다 참조되지 않은 메모리의 조각 : -
// defined in class to be used by function
var pitchedAudioPlayer = AVAudioPlayerNode()
var audioEngine = AVAudioEngine()
//Timer Start
self.timer.invalidate()
self.timer = NSTimer.scheduledTimerWithTimeInterval(tempo, target: self, selector: #selector(ViewController.timeTriggerPointer), userInfo: nil, repeats: true)
//Timer calls... (along with some other unrelated stuff)
func timeTriggerPointer() {
soundPlayer.playPitchedAudio(pitchFilePath, pitch: -1000.0)
}
솔루션
import AVFoundation
class SoundPlayer {
var pitchedAudioPlayer = AVAudioPlayerNode()
var audioEngine = AVAudioEngine()
let audioPlayerNode = AVAudioPlayerNode()
let changePitchEffect = AVAudioUnitTimePitch()
init() {
audioEngine.attachNode(audioPlayerNode)
audioEngine.attachNode(changePitchEffect)
audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil)
audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil)
}
func playPitchedAudio(audioFile: AVAudioFile, pitch: Float){
audioPlayerNode.stop()
changePitchEffect.pitch = pitch
audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
do {
try audioEngine.start()
} catch {
print("error")
}
audioPlayerNode.play()
}
}
무엇이 질문입니까? 누수인지 크래시인가? – matt
죄송합니다. 누출 문제입니다. 충돌은 누수 문제를 해결하지 못한 것입니다. –
어떻게 연결합니까? 질문이 될 것입니다. 나는 누출이 있는지 확실히 모르지만 타이머를 실행할 때 메모리 사용량은 약 120MB까지 계속 증가하고 충돌합니다. 응용 프로그램은 AVAudioPlayer를 사용할 때 제대로 작동했지만 (피치 변경을 허용하지 않음) 확실히이 기능을 일으키는 것입니다. 나는 누수를 추적하는 법을 모르지만 악기를 사용해 보았지만이 단계에서는 나보다 조금 앞서서 작성하지 않은 코드를 가리키는 것처럼 보였다.Xcode에서 직접하는 법을 모릅니다. 도와 주셔서 감사합니다! –