【问题标题】:AVAudioplayer plays data only for a secondAVAudioplayer 只播放数据一秒钟
【发布时间】:2015-12-22 22:35:13
【问题描述】:

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

【问题讨论】:

    标签: ios avaudioplayer alamofire


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2014-03-31
      相关资源
      最近更新 更多