Swift:正在使用 AVPlayer 播放音频 - 音频未播放,听不到音频
Swift: Playing audio using AVPlayer - Audio is not playing, cannot hear audio
我正在使用 AVPlayer 仅播放 mp3 音频文件。我使用的 url 经过测试并且工作正常。我需要使用 AVPlayer,因为我需要以编程方式设置 UISlider,而且 AVPlayer 很方便。 UISlider 在音频播放时工作和更新。音频可能正在播放,但我听不到声音。我这样说是因为 UISlider 正在工作。
更新:您可以在模拟器上构建应用程序时听到音频。在设备上构建它时出现问题 - 我的是 XS MAX。
Link 录屏 ->
访问:https://streamable.com/nkbn8
我已经尝试使用相同的 URL 与 AVAudioPlayer 和音频播放,你可以听到它。
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() 之前使用以下代码:
do {
try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
}
catch {
// report for an error
print(error)
}
我正在使用 AVPlayer 仅播放 mp3 音频文件。我使用的 url 经过测试并且工作正常。我需要使用 AVPlayer,因为我需要以编程方式设置 UISlider,而且 AVPlayer 很方便。 UISlider 在音频播放时工作和更新。音频可能正在播放,但我听不到声音。我这样说是因为 UISlider 正在工作。
更新:您可以在模拟器上构建应用程序时听到音频。在设备上构建它时出现问题 - 我的是 XS MAX。
Link 录屏 -> 访问:https://streamable.com/nkbn8
我已经尝试使用相同的 URL 与 AVAudioPlayer 和音频播放,你可以听到它。
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() 之前使用以下代码:
do {
try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
}
catch {
// report for an error
print(error)
}