更改 AVPlayer 当前项目(项目 url)并开始播放

Change of AVPlayer current item (item url) and start playback

我有一个 UITableView,其中的帖子包含 URLs 到 mp3 文件。通过点击 UITableViewCell 中的按钮,我计划获取 AVPlayer 的单例实例。如何将新的 URL 分配给 AVPlayer 并开始播放? AVPlayer 的 currentItem 只是一个 { get } 属性.

这就是我现在拥有的。

import Foundation
import AVFoundation

class StreamMusicPlayer: AVPlayer {
    private override init(){
        super.init()
    }

    static func shared() -> AVPlayer{
        return AVPlayer()
    }

    func playItem(at itemURL: URL) {
        if StreamMusicPlayer.shared().isPlaying {
            StreamMusicPlayer.shared().pause()
        }

        //Change url of AVPlayerItem
        //And and assign it to shared() instance then begin playback
    }
}

extension AVPlayer {
    var isPlaying: Bool {
        return rate != 0 && error == nil
    }
}

这可能就是您想要的。它并不完美。

class StreamMusicPlayer: AVPlayer {
    private override init(){
        super.init()
    }

    static var shared = AVPlayer()

    static func playItem(at itemURL: URL) {
        StreamMusicPlayer.shared = AVPlayer(url: itemURL)
        StreamMusicPlayer.shared.play()
    }
}

extension AVPlayer {
    var isPlaying: Bool {
        return rate != 0 && error == nil
    }
}

我不得不将静态函数更改为普通变量。每次您访问 .shared() 时,它都会初始化并 return 一个新实例。

那么你可以这样做:

StreamMusicPlayer.playItem(at: URL(string: "http://antoon.io/e/mp3/")!)
// Delay so you can hear it changing
StreamMusicPlayer.playItem(at: URL(string: "http://antoon.io/e/mp3/2.mp3")!)