在iOS中首次使用AVAudioEngine播放声音
我有一个声音文件,它听的是嘟嘟声,我必须反复播放这个声音,根据某些情况改变音高。我正在使用AVAudioEngine、AVAudioPlayerNode和AVAudioUnitTimePitch来实现这一目标。在我的视图中有两个按钮,即播放和停止。当我第一次按下播放按钮时,声音会反复播放,但在单击停止按钮一次,然后再次单击播放按钮后,声音不会播放,也不会出现错误。我一直在研究这个问题很长时间,但无法得到解决方案,我来到这里。你能帮我解决这个问题吗。或者我的问题还有其他的解决方案吗?我的代码如下:在iOS中首次使用AVAudioEngine播放声音,ios,avfoundation,avaudioengine,pitch-shifting,avaudioplayernode,Ios,Avfoundation,Avaudioengine,Pitch Shifting,Avaudioplayernode,我有一个声音文件,它听的是嘟嘟声,我必须反复播放这个声音,根据某些情况改变音高。我正在使用AVAudioEngine、AVAudioPlayerNode和AVAudioUnitTimePitch来实现这一目标。在我的视图中有两个按钮,即播放和停止。当我第一次按下播放按钮时,声音会反复播放,但在单击停止按钮一次,然后再次单击播放按钮后,声音不会播放,也不会出现错误。我一直在研究这个问题很长时间,但无法得到解决方案,我来到这里。你能帮我解决这个问题吗。或者我的问题还有其他的解决方案吗?我的代码如下:
import UIKit
import AVFoundation
class ViewController: UIViewController {
let engine = AVAudioEngine()
let audioPlayer = AVAudioPlayerNode()
let pitchUnit = AVAudioUnitTimePitch()
var avAudioFile: AVAudioFile!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let path = Bundle.main.path(forResource: "Beep", ofType: "wav")!
let url = NSURL.init(fileURLWithPath: path)
avAudioFile = try? AVAudioFile(forReading: url as URL)
setup()
}
func setup() {
engine.attach(audioPlayer)
engine.attach(pitchUnit)
engine.connect(audioPlayer, to: pitchUnit, format: nil)
engine.connect(pitchUnit, to:engine.mainMixerNode, format: nil)
try? engine.start()
audioPlayer.volume = 1.0
audioPlayer.play()
}
@IBAction func playSound(_ sender: UIButton) {
pitchUnit.pitch = 1
// interrupt playing sound if you have to
if audioPlayer.isPlaying {
audioPlayer.stop()
audioPlayer.play()
}
let buffer = AVAudioPCMBuffer(pcmFormat: avAudioFile.processingFormat, frameCapacity: AVAudioFrameCount(avAudioFile.length))
try? avAudioFile.read(into: buffer!)
audioPlayer.scheduleBuffer(buffer!, at: nil, options: AVAudioPlayerNodeBufferOptions.loops, completionHandler: nil)
}
@IBAction func stopSound(_ sender: UIButton) {
audioPlayer.stop()
}
}
问题在于您的playSound功能
// interrupt playing sound if you have to
if audioPlayer.isPlaying {
audioPlayer.stop()
audioPlayer.play()
}
只有当玩家已经在玩时,你才尝试玩它。所以这没有任何意义。您可以删除这些行,只需使用这些行即可
audioPlayer.play()
总是一样的声音吗?你知道你不需要重新启动声音来改变音调。另外,您可能希望使用
pitchUnit.rate
而不是pitch
,它是一个八度音阶的1200分之一。@rhyticfistman是的,它是相同的声音,但如果设备距离某个点大约在5米以内,它会播放嘟嘟声,当一个人离这个点越来越近时,它会增加音调或速率,当距离超过5米时,声音就会停止。当设备回到5米的范围内时,我遇到了重新启动声音的问题。