快速恢复 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 不会播放声音

AVAudioPlayer 多重声音嘈杂

touchesMoved中的SpriteKit + AVAudioPlayer:杀死fps

AVAudioPlayer 音量与系统音量不一样

OpenAL vs AVAudioPlayer vs 其他播放声音的技术