2015-12-21 33 views
0

我正在嘗試從soundcloud播放歌曲。由於iOS-SDK已經停產,我必須自己做所有的認證和流媒體。在播放歌曲時,我基本上會用Alamofire創建一個流,並將接收數據解析爲AVAudioplayer實例。然後它會播放一秒鐘的聲音並暫停播放。我錯過了什麼?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

您不應該使用AVAudioPlayer,因爲它只用於播放本地文件。 相反,您可以使用音頻隊列來播放音頻流或音頻單元,即較低級別的API。 由於音頻流是一個「流」,您可以嘗試CFReadStream/NSInputStream或音頻文件流連續讀取數據,而不僅僅是「get」。 因此,例如,您可以使用CFReadStream + Audio Queue來播放聲音。這很困難,祝你好運!