我有一个视频播放器,当我在本地捕获音频记录并将它们存储在设备上的某个位置时,它可以正常工作.当我try 上传录音到Firestore时,音频被正确上传,我可以将链接粘贴到Google中来收听正确的音频文件.然而,当我try 使用相同的音频播放器播放带有Firestore链接的音频时,我得到了下面的错误.我try 在URL中添加".m4a"扩展名并将其删除,但一直收到相同的错误.
播放失败.操作无法完成.(操作系统状态错误2003334207.)
工作URL
100
100
音频播放器
import SwiftUI
import AVFoundation
public final class AudioPlayer: NSObject, ObservableObject, AVAudioPlayerDelegate {
@Published public var soundSamples: [SampleModel] = []
@Published public var isPlaying = false
var audioPlayer = AVAudioPlayer()
private var timer: Timer?
private var currentSample: Float = 0
private let numberOfSamples: Int
private var durationTimer: Timer?
var fileDuration: TimeInterval = 0
var currentTime: Int = 0
static let shared = AudioPlayer(numberOfSamples: 15)
public init(isPlaying: Bool = false, audioPlayer: AVAudioPlayer = AVAudioPlayer(), timer: Timer? = nil, numberOfSamples: Int) {
self.isPlaying = isPlaying
self.audioPlayer = audioPlayer
self.timer = timer
self.numberOfSamples = numberOfSamples
}
func playSystemSound(soundID: SystemSoundID) {
AudioServicesPlaySystemSound(soundID)
}
func startPlayback(audio: URL) {
let original = audio.absoluteString
print(original)
let updatedURL = original + ".m4a"
print(updatedURL)
do {
try AVAudioSession.sharedInstance().setCategory(.playback, options: .duckOthers)
try AVAudioSession.sharedInstance().setActive(true)
audioPlayer = try AVAudioPlayer(contentsOf: URL(string: updatedURL)!)
audioPlayer.volume = 1.0
audioPlayer.delegate = self
audioPlayer.play()
withAnimation {
isPlaying = true
}
fileDuration = audioPlayer.duration.rounded()
startMonitoring()
} catch let error {
print("Playback failed.\(error.localizedDescription)")
}
}
func startMonitoring() {
audioPlayer.isMeteringEnabled = true
currentTime = Int(fileDuration)
timer = Timer.scheduledTimer(withTimeInterval: 0.03, repeats: true) { [weak self] _ in
guard let this = self else { return }
this.audioPlayer.updateMeters()
this.currentSample = this.audioPlayer.peakPower(forChannel: 0)
this.soundSamples.append(SampleModel(sample: this.currentSample))
}
durationTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
guard let this = self else { return }
this.currentTime -= 1
}
}
private func stopMonitoring() {
soundSamples = []
audioPlayer.isMeteringEnabled = false
timer?.invalidate()
durationTimer?.invalidate()
currentTime = Int(fileDuration)
}
public func stopPlayback() {
audioPlayer.stop()
stopMonitoring()
withAnimation {
isPlaying = false
}
}
public func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if flag {
stopPlayback()
}
}
}