2015-12-21 41 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来播放声音。这很困难,祝你好运!