如何使用 AVQueuePlayer?

Posted

技术标签:

【中文标题】如何使用 AVQueuePlayer?【英文标题】:How to use AVQueuePlayer? 【发布时间】:2018-02-09 13:41:11 【问题描述】:

我想在 ios 上播放来自远程服务器的一组视频文件。我不想使用 HLS 播放列表。

我正在尝试使用 AVQueuePlayer。这是我初始化它的方式:

let url = URL(string: "https://example.com/video.ts")! // 10 second video
let item = AVPlayerItem(url: url)
let player = AVQueuePlayer(items: [item])
player.play()

当我在屏幕上显示此播放器时,使用 AVPlayerLayer 和自定义视图或使用 AVPlayerViewController,它只显示加载图标而没有内容。几秒钟后,当我检查player.items() 数组时,那里什么都没有。

这是预期的行为吗?如何完成我的任务?

【问题讨论】:

【参考方案1】:

好吧,让我认为代码是这样的。

import UIKit
import AVFoundation

class ViewController: UIViewController 

    private var player: AVQueuePlayer?
    private var playerLayer: AVPlayerLayer?

    override func viewDidLoad() 
        super.viewDidLoad()
        super.view.backgroundColor = UIColor.lightGray

        // Video file for demo
        let mediaPath = URL(fileURLWithPath:Bundle.main.path(forResource: "ChoppedBipBop", ofType: "m4v")!)

        startDemoVideo(videoURL: mediaPath)
    

    public func startDemoVideo(videoURL: URL) 
        player = AVQueuePlayer()
        playerLayer = AVPlayerLayer(player: player)

        guard let playerLayer = playerLayer else  fatalError("Error creating player layer") 
        playerLayer.frame = view.layer.bounds
        view.layer.addSublayer(playerLayer)

        let videoAsset = AVURLAsset(url: videoURL)

        videoAsset.loadValuesAsynchronously(forKeys: ["duration", "playable"]) 

            DispatchQueue.main.async 
                let loopItem = AVPlayerItem(asset: videoAsset)
                self.player?.insert(loopItem, after: nil)

                self.player?.play()
            
        
    


编辑:我把我所有用于演示的代码我有一个本地文件视频,所以你需要用一个 URL 请求对象替换,如果你想测试你可以做一个单视图使用 Swift 的 App 项目并在您的 ViewController 中替换它,然后构建并运行:)

【讨论】:

尝试新的代码更改 :) 希望对您有所帮助。【参考方案2】:

问题可能出在您的媒体上。 iOS 上的AVPlayer 不支持直接播放.ts 文件。这些必须包含在 HLS 播放列表中。

【讨论】:

以上是关于如何使用 AVQueuePlayer?的主要内容,如果未能解决你的问题,请参考以下文章

在 AVQueuePlayer 中播放完最后一项后如何显示工作表视图?

使用带有 AVQueuePlayer 的 Switch 语句?

当 AVQueuePlayer 完成最后一个播放项时如何做某事

AVQueuePlayer 从资产跳转到另一个时令人讨厌的延迟

可以使用 AVQueuePlayer 在队列顶部插入项目吗?

AVQueuePlayer 不播放声音