我正试图从soundcloud播放歌曲。由于iOS-SDK已经停产,我必须自己完成所有的身份验证和流媒体内容。在流式传输歌曲时,我基本上使用Alamofire创建一个流,并将接收数据解析为AVAudioplayer实例。然后播放声音一秒钟并暂停。我错过了什么?
class SoundcloudPlayer: NSObject, AVAudioPlayerDelegate {
var clientProvider: SoundcloudConnectorProvider!
var track: SoundcloudTrack?
private var stream: Request?
private var audioData = NSMutableData()
private var audioPlayer: AVAudioPlayer!
override init() {
super.init()
}
func play(){
if let client = clientProvider?.currentClient() where client.hasUnexpiredAccessToken() && track != nil{
stream = client.request(.GET, self.track!.url!).stream({ (data) -> Void in
self.audioData.appendData(data)
if self.audioPlayer == nil{
do{ self.audioPlayer = try AVAudioPlayer(data: self.audioData)} catch {print("error") }
self.audioPlayer.delegate = self
self.audioPlayer.play()
}
print(self.audioPlayer.data?.length)
}).progress({ (read, total, expected) -> Void in
Async.main(block: { () -> Void in
//print("\(total)/\(expected)")
})
})
}
}
}
答案 0 :(得分:0)
您不应该使用AVAudioPlayer,因为它仅用于播放本地文件。 相反,您可以使用音频队列,播放音频流,或音频单元,更低级别的API。 由于音频流是“流”,您可以尝试CFReadStream / NSInputStream或音频文件流连续读取数据,而不仅仅是“获取”。 例如,您可以使用CFReadStream + Audio Queue播放声音。这很难,祝你好运!