[英]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.