如何在 AVAudioPlayer 中播放 0.5 秒的 1 秒音效?

Posted

技术标签:

【中文标题】如何在 AVAudioPlayer 中播放 0.5 秒的 1 秒音效?【英文标题】:how can a 1 second audio effect be played for 0.5 seconds in AVAudioPlayer? 【发布时间】:2015-12-18 13:18:02 【问题描述】:

我正在使用以下代码在我的 Swift SpriteKit 游戏中播放音效。

    func setupAudioPlayerWithFile(file:NSString, type:NSString) -> AVAudioPlayer  
    let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
    let url = NSURL.fileURLWithPath(path!)
    var audioPlayer:AVAudioPlayer?

    do 
        try audioPlayer = AVAudioPlayer(contentsOfURL: url)
     catch 
        print("NO AUDIO PLAYER")
    

    return audioPlayer!

音效的持续时间是一秒,我每次以 0.5 秒的间隔创建一个精灵时调用它。由于音效比创建间隔长,所以音效只播放一次。我相信减少效果持续时间可以解决这个问题,尽管我对解决我的问题的其他方法持开放态度。

【问题讨论】:

如果你需要这首歌在其他地方有秒,那么我的问题是你想如何播放声音,超快或只有一半的声音。如果声音只有 0.5 秒的剪辑,那么我会进入 iTunes 并创建一个 0.5 秒的剪辑 我希望播放速度更快,半秒内 那么我建议切换到使用带有 SKAction 的 SKNode 子节点,并使用 SKAction.playSoundWithFileNamed 播放声音,然后以 2 倍的速度运行(当然,除非这个声音总是以 2 倍的速度播放,那么我会预先生成 2x 版本并将节点保持在 1x)如果这是您想要采取的路线,我会做出解释说明这一点的答案 尝试使用SKAction.playSoundWithFileNamed每间隔int需要播放,并在update()函数中控制时间间隔。 【参考方案1】:

你也可以使用AVAudioEngine()

只需将您的音频文件放入AVAudioEngine() 并使用以下参数更改速度:

// The default value is 1.0. The range of supported values is 1/32 to 32.0.
changeAudioUnitTime.rate = 1.0

示例代码如下:

    var audioPlayer: AVAudioPlayer!
    var audioEngine = AVAudioEngine()
    var audioFile: AVAudioFile!
    var audioPlayerNode: AVAudioPlayerNode?

    audioPlayer = try AVAudioPlayer(contentsOfURL: currentAudio!)
    audioFile = try! AVAudioFile(forReading: audioPlayer!.url!)
    audioEngine.attachNode(audioPlayerNode!)

    let changeAudioUnitTime = AVAudioUnitTimePitch()
    // The default value is 1.0. The range of supported values is 1/32 to 32.0.
    changeAudioUnitTime.rate = 1.0
    audioEngine.attachNode(changeAudioUnitTime)
    audioEngine.connect(audioPlayerNode!, to: changeAudioUnitTime, format: nil)
    audioEngine.connect(changeAudioUnitTime, to: audioEngine.outputNode, format: nil)
            audioPlayerNode!.scheduleFile(audioFile, atTime: nil, completionHandler: nil)
    do 
       try audioEngine.start()
     catch 
       print("audio Engine could not be started: \(error)")
    

    // play the costumized sound
    audioPlayerNode!.play()

希望这个例子对你有所帮助....如果我理解错了,请随时纠正我。问候,亚历克斯

【讨论】:

以上是关于如何在 AVAudioPlayer 中播放 0.5 秒的 1 秒音效?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AVAudioPlayer 中循环播放多个音频文件?

如何在 Swift 3 中使用 AVAudioPlayer 播放 .ogg 音频文件?

如何持续检查 AVAudioplayer 是不是已在 Swift 中播放完毕?

如何在 ios5 中播放本地方法的 AVAudioPlayer?

如何在 iOS 上使用 AVAudioPlayer 播放指定持续时间的声音?

如何在播放时在标签中获取 AVAudioplayer 中的当前时间