Swift:使用AVPlayer播放音频-音频未播放,无法听到音频

Swift:使用AVPlayer播放音频-音频未播放,无法听到音频,swift,audio,avfoundation,avplayer,Swift,Audio,Avfoundation,Avplayer,我使用AVPlayer仅播放mp3音频文件。我正在使用一个我测试过的url,并且运行良好。我需要使用AVPlayer,因为我需要以编程方式设置UISlider,而且AVPlayer很方便。UISlider在音频播放时工作并更新。音频可能正在播放,但我听不到声音。我这样说是因为UISlider正在工作 更新:在模拟器上构建应用程序时,您可以听到音频。在设备上构建时出现问题-我的是XS MAX 链接到屏幕记录-> 访问: 我已经尝试过在AVAudioPlayer和音频播放中使用相同的URL,你可以听

我使用AVPlayer仅播放mp3音频文件。我正在使用一个我测试过的url,并且运行良好。我需要使用AVPlayer,因为我需要以编程方式设置UISlider,而且AVPlayer很方便。UISlider在音频播放时工作并更新。音频可能正在播放,但我听不到声音。我这样说是因为UISlider正在工作

更新:在模拟器上构建应用程序时,您可以听到音频。在设备上构建时出现问题-我的是XS MAX

链接到屏幕记录-> 访问:

我已经尝试过在AVAudioPlayer和音频播放中使用相同的URL,你可以听到

private func setupAudioContent() {

    let urlString = "https://s3.amazonaws.com/kargopolov/kukushka.mp3"
    if let url = NSURL(string: urlString) {
        audioPlayer = AVPlayer(url: url as URL)

        let playerLayer = AVPlayerLayer(player: audioPlayer)
        self.layer.addSublayer(playerLayer)
        playerLayer.frame = self.frame

        audioPlayer?.play()
        audioPlayer?.volume = 1.0
        audioPlayer?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

        let interval = CMTime(value: 1, timescale: 2)
        audioPlayer?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (progressTime) in

            let currentTime = CMTimeGetSeconds(progressTime)
            let currentTimeSecondsString = String(format: "%02d", Int(currentTime.truncatingRemainder(dividingBy: 60)))
            let currentTimeMinutesString = String(format: "%02d", Int(currentTime / 60))
            self.currentTimeLabel.text = "\(currentTimeMinutesString):\(currentTimeSecondsString)"

            if let duration = self.audioPlayer?.currentItem?.duration {
                let durationsSeconds = CMTimeGetSeconds(duration)

                self.audioSlider.value = Float(currentTime / durationsSeconds)
            }
        })
    }
}


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "currentItem.loadedTimeRanges" {
        isAudioPlaying = true

        if let duration = audioPlayer?.currentItem?.duration {
            let seconds = CMTimeGetSeconds(duration)
            let secondsText = Int(seconds) % 60
            let minutesText = String(format: "%02d", Int(seconds) / 60)
            audioLengthLabel.text = "\(minutesText):\(secondsText)"
        }
    }
}


@objc func handleSliderChange() {
    if let duration = audioPlayer?.currentItem?.duration {
        let totalSeconds = CMTimeGetSeconds(duration)
        let value = Float64(audioSlider.value) * totalSeconds
        let seekTime = CMTime(value: Int64(value), timescale: 1)
        audioPlayer?.seek(to: seekTime, completionHandler: { (completedSeek) in
        })
    }
}
预期结果:听到音频播放


实际结果:听不到音频播放。似乎音频播放时没有声音。

使用AVPlayer时,应确保设备未处于静音模式,因为即使音量达到最大值,也会导致无法输出音频

如果要使设备保持静默模式并仍播放音频,可以在.play()之前使用以下代码:


我尝试使用最简单的版本,它可以在模拟器和设备(XS)上工作

如@N.Der所述,检查类别模式。在这种情况下,在静音模式下,听不到音频

import AVFoundation
import UIKit

final class ViewController: UIViewController {
    private var audioPlayer: AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        setupAudioContent()
    }

    private func setupAudioContent() {
        guard let url = URL(string: "https://s3.amazonaws.com/kargopolov/kukushka.mp3")
            else { return }

        audioPlayer = AVPlayer(url: url as URL)
        audioPlayer?.play()
    }
}

要轻松管理avplayer配置和所有中断,您可以尝试以下库:

OP询问本地文件谢谢,这对我有用。但是,当您使用try?时,不需要用do catch来包围调用:)
import AVFoundation
import UIKit

final class ViewController: UIViewController {
    private var audioPlayer: AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        setupAudioContent()
    }

    private func setupAudioContent() {
        guard let url = URL(string: "https://s3.amazonaws.com/kargopolov/kukushka.mp3")
            else { return }

        audioPlayer = AVPlayer(url: url as URL)
        audioPlayer?.play()
    }
}