ios - 如何使用AVPlayer播放Data类型视频?

标签 ios swift avplayer

我正在尝试使用以下代码从远程下载后播放视频。

let player = AVPlayer(url: URL(dataRepresentation: VideoService.instance.videoInfoArray[0].video, relativeTo: nil)!)
let playerController = AVPlayerViewController()
playerController.player = player
present(playerController, animated: true) {
player.play()
}

我的VideoService类是一个单例类,视频变量类型是Data()。但是,当我尝试使用以下代码播放视频时,它不起作用。如何使用数据代表播放视频?

最佳答案

根据URL class documentation初始化器 init?(dataRepresentation:relativeTo:isAbsolute:) 采用 Data 参数,是的,但该数据应该是 URL 字符串<的 ASCII 表示形式/strong>,不是您想要播放的实际数据。

您需要做的是将视频数据保存到文件中,并使用该文件的 URL 来初始化 AVPlayer

guard let url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)?.first else { return }
url.appendPathComponent("video.mpeg") // or whatever extension the video is
VideoService.instance.videoInfoArray[0].video.write(to: url) // assuming video is of Data type
let player = AVPlayer(url: url)
// other stuff with the player

要确定播放器无法播放文件的原因,请使用 key-value observing of player's status property 。如果您发现 AVPlayer.Status.failed 发生更改,则可以检查播放器的 error 属性以查看本地化原因和错误代码。

var playerStatusContext = 0
player.addObserver(player, forKeyPath: "status", options: [.new, .initial], context: &playerStatusContext)

// (...)

override func observeValue(forKeyPath keyPath: String?,
                       of object: Any?,
                       change: [NSKeyValueChangeKey : Any]?,
                       context: UnsafeMutableRawPointer?) {

    // Only handle observations for the playerItemContext
    guard context == &playerStatusContext else {
        super.observeValue(forKeyPath: keyPath,
                           of: object,
                           change: change,
                           context: context)
        return
    }

    if keyPath == #keyPath(AVPlayer.status) {
        let status: AVPlayer.Status
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayer.Status(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        if status == .failed {
            print(player.error)
        }
    }
}

关于ios - 如何使用AVPlayer播放Data类型视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51172305/

相关文章:

ios - 当 AVPlayer 准备好播放时,addObserver 到 AVPlayer 永远不会被调用?

iphone - 移除对 armv7s 架构的支持是否仍然适用于 iPhone 5 屏幕?

ios - Xcode "Analyze"消息混淆

ios - 选择 UICollectionView 中的单元格时调整图像大小

swift - 在 Swift 中使用编译器变量

iOS 播放视频的速度超过 2 倍?

iphone - GPUImageMovie 播放控件

ios - iOS 7 部分导航返回项不可点击

ios - 为什么 NSManagedObject 实例不持有对其 NSManagedObjectContext 的强引用?

ios - AutoLayout Storyboard 约束 - 如何在代码中修改以在 Orientation 更改中使用此修改