AVPlayer在播放之前加载多次 - 流式传输之前的长时间延迟

时间:2017-01-06 15:25:15

标签: swift xcode streaming avplayer

我面对一个非常独特的情况,AVPlayer正试图在最终播放之前多次加载一个URL(我在控制中心看到),经过大约120秒左右的长时间延迟(有时候)更多)。我不知道为什么会这样。我使用KDEAudioPlayer的单例实例 - 任何帮助将不胜感激。

KDEAudioPlayer代码:

import UIKit
import KDEAudioPlayer

var urlToPlay : NSURL!
var titleTrackBeingPlayed = String?()

class MediaPlayerViewController: FXBlurView, AudioPlayerDelegate {

//MARK: Variables
var seekToTime = NSTimeInterval()
var streaming = true

var timer:NSTimer?
var change:CGFloat = 0.01

//MARK: Connections
@IBOutlet weak var loadingActivityIndicator: UIActivityIndicatorView!
@IBOutlet weak var streamingFromServerLabel: UILabel!
@IBOutlet weak var timelineSlider: UISlider!
@IBOutlet weak var totalTimeLabel: UILabel!
@IBOutlet weak var nowTimeLabel: UILabel!
@IBOutlet weak var toggleButton: UIButton!
@IBOutlet weak var volumeControlSlider: UISlider!
@IBOutlet weak var titleLabel: UILabel!

//MARK: Actions
@IBAction func endTrackPlayerButtonPressed(sender: UIButton) {
    //TODO: R&D how to dismiss.
    print("media player view to be dismissed")
    if let viewWithTag = self.viewWithTag(1089) {
        print("Tag 1089")
        Singleton.stop()
        viewWithTag.removeFromSuperview()
    }
}

@IBAction func timelineSliderValueChanged(sender: UISlider) {
    Singleton.pause()
    Singleton.seekToTime(NSTimeInterval(sender.value))
    timelineSlider?.setValue(sender.value, animated: true)
    Singleton.resume()
}

@IBAction func playPauseButtonPressed(sender: UIButton) {
      toggle()
}

//MARK: Initializer for Class

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    self.tintColor = UIColor.clearColor()
    if Singleton.isPlaying {
        Singleton.isPlaying = false
    }
    playerSetup()
    toggle()
}

//MARK: Setup for Audio Player

func playerSetup() {
    Singleton.playItemWithUrl(urlToPlay)
    Singleton.player.delegate = self
    timelineSlider?.continuous = true

    self.titleLabel?.text = titleTrackBeingPlayed
}

internal func refreshAudioView(_ :NSTimer) {
}

func toggle(){
    if Singleton.isPlaying {
        pauseTrack()
        toggleButton.setImage(UIImage(named: "Play"), forState: .Normal)

    }
    else if !Singleton.isPlaying {
        playTrack()
        toggleButton?.setImage(UIImage(named: "Pause"), forState: .Normal)

    }
}

func audioPlayer(audioPlayer: AudioPlayer, willStartPlayingItem item: AudioItem) {
    titleLabel.text = titleTrackBeingPlayed
}


func audioPlayer(audioPlayer: AudioPlayer, didFindDuration duration: NSTimeInterval, forItem item: AudioItem) {
    totalTimeLabel?.text = makeTimeString(Float(duration))
    timelineSlider?.maximumValue = Float(duration)
    timelineSlider?.minimumValue = 0.0
    self.titleLabel?.text = titleTrackBeingPlayed
}

func audioPlayer(audioPlayer: AudioPlayer, didUpdateProgressionToTime time: NSTimeInterval, percentageRead: Float) {
    timelineSlider?.setValue(Float(time), animated: true)
    nowTimeLabel?.text = makeTimeString(Float(time))
    Singleton.player.volume = volumeControlSlider.value
    seekToTime = time
}

override func remoteControlReceivedWithEvent(event: UIEvent?) {
    if let event = event {
        Singleton.player.remoteControlReceivedWithEvent(event)
        self.canBecomeFirstResponder()
    }
}

func audioPlayer(audioPlayer: AudioPlayer, didChangeStateFrom from: AudioPlayerState, toState to: AudioPlayerState) {
    if to == .Playing {
        if streaming {
            streamingFromServerLabel.hidden = false
            loadingActivityIndicator.hidden = true
            toggleButton?.setImage(UIImage(named: "Pause"), forState: .Normal)
        }
        timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(TrackMediaPlayerViewController.refreshAudioView(_:)), userInfo: nil, repeats: true)
    }
    else if to == .Buffering || to == .WaitingForConnection {
        loadingActivityIndicator.hidden = false
    }
    else {
        streamingFromServerLabel.hidden = true
    }
}

func playTrack() {
    if seekToTime > 0.0 {
        Singleton.resume()
    } else {
        Singleton.play()
    }
    Singleton.isPlaying = true
}

func pauseTrack() {
    Singleton.pause()
    Singleton.isPlaying = false
}

//MARK: Convert NSTime to String
func makeTimeString(value:Float) -> String
{
    if value == 0 || value.isNaN
    {
        return "00:00"
    }

    let hr = (Int)(value / 3600)
    let min = (Int)((value % 3600) / 60)
    let sec = (Int)((value % 3600) % 60)

    let timestamp = String(format:"%d:%02d.%02d", hr, min, sec)
    return timestamp
}

}

单身人士代码:

import Foundation
import UIKit
import KDEAudioPlayer

class Singleton: AudioPlayerDelegate {
static let shareInstance = DarsPlayerSingleton()
static let player = AudioPlayer()
static var isPlaying = Bool()

private init (){
}

static func playItemWithUrl(url: NSURL) {
    let item = AudioItem(mediumQualitySoundURL: url)
    player.playItem(item!)
}

static func play() {
    player.resume()
    isPlaying = true
}

static func pause() {
    player.pause()
    isPlaying = false
}

static func stop() {
    player.stop()
}

static func seekToTime(time: NSTimeInterval){
    player.seekToTime(time)
}

static func resume() {
    player.resume()
}

}

0 个答案:

没有答案