2

我正在使用 AVAudioPlayer 播放音乐文件。当我拨打startorstop时,会听到“咔哒”或“啪”的声音。我用 mp3 和 caf 文件都试过了,在这两种情况下都能听到(虽然我不是每次都听到)。有谁知道如何防止这些故障噪音?

4

4 回答 4

4

对于将来发生这种情况的任何人,您必须将 AVAudioPlayer 的音量调低至 0,然后在stop约 0.5 秒后调用。

于 2013-06-08T03:23:34.433 回答
1

以下提示仅用于stop音频播放。

当我们需要调用stop停止音频播放时,我们可以pause先调用,然后再调用stop。这意味着在我们的自定义停止方法中,我们使用pauseand stopfromAVAudioPlayer来停止播放并防止弹出或点击噪音。

于 2019-05-16T23:57:31.910 回答
1

解决我这边的音频问题(iPhone XS/XR,iOS 13)的唯一方法是使用AVQueuePlayer而不是AVAudioPlayer

func play() {
    guard let url = Bundle.main.url(forResource: "Sound", withExtension: "wav") else {
        return
    }
    let player = AVQueuePlayer(url: url) // It was AVAudioPlayer before 
    player.volume = 1.0
    player.play()
}

不要问我为什么会这样,但确实如此。AVAudioPlayer在我们的 XS/XR 设备中产生咔嗒声/爆裂声。¯_(ツ)_/¯

于 2019-09-24T14:39:52.460 回答
0

我最终使用了 Swift 的淡入功能。我没有注意到停止时的爆裂声,但我很确定你也可以用类似的方法来解决这个问题。这是我如何实现它的示例。请注意,在我的 viewDidLoad 中,我还初始化了一些音频设置。您可能需要尝试使用淡入淡出时间来完善您的音频。

   import UIKit
    import AVKit

    var audioPlayer = AVAudioPlayer()

   override func viewDidLoad() {
        super.viewDidLoad()

        initializeAudioPlayer()
    }

func initializeAudioPlayer() {
    do {
        try session.setCategory(AVAudioSessionCategoryPlayback)
        try session.setActive(true)
    } catch {
        print(error)
    }
}


func soundButtonTapped() {

        let tuneURL:URL = Bundle.main.url(forResource: "left", withExtension: "wav")!
        playSound(tuneURL, withDelay: 0.1)
}




func playSound(_ tuneURL: URL, withDelay delay:Double) {

    do {

        audioPlayer = try AVAudioPlayer(contentsOf: tuneURL, fileTypeHint: AVFileTypeMPEGLayer3) //old version of Swift AVFileType.mp3.rawValue
        audioPlayer = try AVAudioPlayer(contentsOf: tuneURL, fileTypeHint: AVFileTypeMPEG4)
        audioPlayer = try AVAudioPlayer(contentsOf: tuneURL, fileTypeHint: AVFileTypeWAVE)

        audioPlayer.volume = 0.0 //start it at zero
        audioPlayer.numberOfLoops = -1  //loop on
        audioPlayer.prepareToPlay()
        audioPlayer.play()
        audioPlayer.setVolume(1, fadeDuration: delay) //fade in with delay

    } catch let error as NSError {
        NSLog(error.description)
    }
}
于 2019-02-04T21:23:36.413 回答