繁体   English   中英

快速恢复 AVAudioPlayer 中的声音

[英]Resume sound in AVAudioPlayer with swift

我正在尝试播放可以暂停、恢复或停止的声音片段。 我的暂停按钮起作用了,该按钮的动作功能如下所示。 但是我无法让我的简历功能发挥作用。 当我按下恢复按钮时,没有播放音频。 我已经在网上阅读,我能找到的唯一提示是使用 prepareToPlay() 函数并将 shortStartTimeDelay 设置为大于 0.0 的值。 我试过这两种方法都无济于事。

timeAtPause 是 NSTimeInterval 类型的全局变量

暂停按钮的动作函数如下:

@IBAction func pauseAllAudio(sender: UIButton) { timeAtPause = audioPlayer.currentTime audioPlayer.pause() }

恢复按钮的动作函数如下:

@IBAction func resumeAllAudio(sender: UIButton) {
    let shortStartDelay = 0.01
    audioPlayer.prepareToPlay()
    audioPlayer.playAtTime(timeAtPause + shortStartDelay)
}

任何有关如何恢复音频的提示将不胜感激。 感谢您的时间。

您不应该使用playAtTime()来恢复AVAudioPlayer ,如文档所述:

从音频输出设备时间线中的指定点开始异步播放声音。

使用此方法可以精确同步两个或多个 AVAudioPlayer 对象的播放。

而且,即使你使用它,它也应该与deviceCurrentTime结合使用,加上以秒为单位的时间来延迟。 一句话,它并不意味着用于恢复暂停的播放器。 相反,只需使用play()来恢复播放。

你可能做了我所做的。 在调用我的 play() 函数后,我每次都创建了一个新播放器:

// The Wrong Way
@IBAction func playAction(sender: AnyObject) {
    // do and catch omitted for brevity
    player = try AVAudioPlayer(contentsOf: goodURL)
    player.play()
}

但是,这应该在其他一些初始化时间完成,例如当您让用户选择要播放的文件时。 或者,如果您对要播放的文件进行硬编码,则可以在更早的时间进行初始化,例如 viewDidLoad()。

然后,一旦您的 AVAudioPlayer 被初始化,您就可以在其上调用 .play() 和 pause() ,它们将正常工作。 并且 .play() 将在暂停后恢复。

要在音频文件的同一点简单地暂停和重新启动,请执行以下操作:

@IBAction func playAction(sender: AnyObject) {

     player.play()
}


@IBAction func pauseAction(sender: AnyObject) {

    player.pause()
}

我发现这些很有帮助。 如果你在 Swift 中做这件事,我做的有点不同。 我在导入 AVFoundation 后创建了一个 AudioPlayer 类,并使用这两个函数来暂停和恢复音乐。 在 SwiftUI 调用中,我使用了一个在按钮状态之间切换的 @State 布尔值。 这是我使用的代码:

import AVFoundation
class MusicPlayer {
    static let shared = MusicPlayer()
    var audioPlayer: AVAudioPlayer?

    // Pause music
    func pauseBackgroundMusic() {
        guard let audioPlayer = audioPlayer else { return }
        audioPlayer.pause()
    }

    // Resume music
    func resumeBackgroundMusic() {
        guard let audioPlayer = audioPlayer else { return }
        audioPlayer.play()
    }
}

在视图中:定义一个@State 变量:@State var pauseMode = false

并在 Button 动作代码中调用音乐播放器如下:

Button(action: {
    if pauseMode {
            MusicPlayer.shared.resumeBackgroundMusic()
            self.pauseMode.toggle()
        } else {
            MusicPlayer.shared.pauseBackgroundMusic()
            self.pauseMode.toggle()
        }
    })
    {
        Image(systemName: "playpause")
    }

仅供参考 - 我在 SwiftUI 中发布了这个,因为新的程序员(和 Apple)似乎正在朝这个方向发展。 我想这可能会帮助到这个问题寻求 Swift/SwiftUI 答案的人(像我一样!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM