Swift4中如何从服务器播放MP3音频?测试函数报错求助
解决Swift 4中从服务器播放MP3音频的问题
你遇到的报错其实是两个核心问题导致的,咱们一步步拆解解决:
1. 错误的URL构造方式
你用了URL(fileURLWithPath: soundUrl)这个方法,它是专门用来构造本地文件路径URL的,而服务器音频地址是网络资源,必须用URL(string: soundUrl)来创建网络URL,这是最直接的错误点。
2. AVAudioPlayer不适合网络音频播放
AVAudioPlayer的设计定位是本地音频文件播放,它不支持流式加载网络音频,这也是你在真实设备上触发报错的关键原因。针对网络音频,苹果官方推荐使用AVPlayer,它专门适配了网络流媒体的播放需求。
正确的实现代码
首先确保你已经导入AVFoundation框架,然后替换成下面的代码:
import AVFoundation // 重要:把AVPlayer实例声明为类的属性/全局变量,不能放在函数里当局部变量,否则会被立即释放导致无法播放 var audioPlayer: AVPlayer? func playSound(soundUrl: String) { guard let audioUrl = URL(string: soundUrl) else { print("传入的音频URL格式无效") return } let playerItem = AVPlayerItem(url: audioUrl) audioPlayer = AVPlayer(playerItem: playerItem) audioPlayer?.play() }
额外必看注意事项
- ATS配置:如果你的音频地址是HTTP协议(非HTTPS),iOS 10及以上系统默认的App Transport Security(ATS)会拦截HTTP请求。需要在
Info.plist中添加例外:
右键Info.plist→ 选择"Add Row",添加App Transport Security Settings,再在其下添加Allow Arbitrary Loads并设置为YES。 - 错误监听优化:可以给
AVPlayerItem添加状态监听,捕获加载失败的具体原因,示例代码如下:playerItem.addObserver(self, forKeyPath: "status", options: [.new], context: nil) // 实现监听回调方法 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard keyPath == "status", let item = object as? AVPlayerItem else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) return } switch item.status { case .failed: print("音频加载失败:\(item.error?.localizedDescription ?? "未知错误")") case .readyToPlay: print("音频准备完成,开始播放") case .unknown: print("音频状态未知,正在加载中") @unknown default: break } }
按照上面的修改,你应该就能正常播放服务器上的MP3音频了。
内容的提问来源于stack exchange,提问作者user9212972
相关产品推荐
相关产品推荐

