快速恢复 AVAudioPlayer 中的声音
Posted
技术标签:
【中文标题】快速恢复 AVAudioPlayer 中的声音【英文标题】:Resume sound in AVAudioPlayer with swift 【发布时间】:2016-02-13 11:42:19 【问题描述】:我正在尝试播放可以暂停、恢复或停止的声音片段。我的暂停按钮有效,该按钮的操作功能如下所示。但是我无法让我的简历功能正常工作。当我按下恢复按钮时,没有播放音频。我在网上阅读过,我能找到的唯一提示是使用 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)
非常感谢任何有关如何恢复音频的提示。 感谢您的宝贵时间。
【问题讨论】:
查看此链接,可能对您有所帮助ioscreator.com/tutorials/play-music-avaudioplayer-ios8-swift 【参考方案1】:您不应该使用playAtTime()
来恢复AVAudioPlayer
,因为documentation 声明:
从指定点开始异步播放声音 音频输出设备的时间线。
和
使用此方法可以精确同步播放两个或多个 AVAudioPlayer 对象。
而且,即使你使用它,它也应该与deviceCurrentTime
一起使用,加上以秒为单位的延迟时间。总之,它并不是用来恢复暂停的播放器。相反,只需使用play()
即可恢复播放。
【讨论】:
感谢您花时间回答。如果我改用 audioPlayer.play() ,我仍然没有得到正确的行为。现在,如果我按下暂停,音频将停止播放扬声器,然后当我按下恢复时,它不会在我按下暂停时恢复播放。它通过 mp3 继续播放【参考方案2】:你可能做了我做过的事。在调用我的 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() 将在暂停后恢复。
【讨论】:
【参考方案3】:要在音频文件中的同一点简单地暂停和重新启动,可以使用以下方法:
@IBAction func playAction(sender: AnyObject)
player.play()
@IBAction func pauseAction(sender: AnyObject)
player.pause()
【讨论】:
【参考方案4】:我发现这些很有帮助。如果你在 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 答案的人(比如我!)。
【讨论】:
以上是关于快速恢复 AVAudioPlayer 中的声音的主要内容,如果未能解决你的问题,请参考以下文章
播放音乐时,我的音频应用程序中没有收到通知或消息的声音 | AV音频播放器
在其他 swift 文件中调用时,AVAudioPlayer 不会播放声音