AVAudioplayer仅播放数据一秒钟

时间:2015-12-21 23:38:23

标签: ios avaudioplayer alamofire

我正试图从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)")
                })
            })
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您不应该使用AVAudioPlayer,因为它仅用于播放本地文件。 相反,您可以使用音频队列,播放音频流,或音频单元,更低级别的API。 由于音频流是“流”,您可以尝试CFReadStream / NSInputStream或音频文件流连续读取数据,而不仅仅是“获取”。 例如,您可以使用CFReadStream + Audio Queue播放声音。这很难,祝你好运!