如何使用 AVPlayer 播放数据类型的视频?
How to play Data type video using 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 class 是单例 class 并且视频变量类型是 Data()
。但是,当我尝试使用以下代码播放视频时,它不起作用。如何使用数据代表播放视频?
根据 URL class documentation 初始化程序 init?(dataRepresentation:relativeTo:isAbsolute:)
采用 Data
参数,是的,但是该数据应该是 [=28= 的 ASCII 表示] string,不是你要播放的实际数据
您需要做的是将您的视频数据保存到一个文件中,并使用该文件的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)
}
}
}
我尝试使用以下代码从远程下载后播放视频。
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 class 是单例 class 并且视频变量类型是 Data()
。但是,当我尝试使用以下代码播放视频时,它不起作用。如何使用数据代表播放视频?
根据 URL class documentation 初始化程序 init?(dataRepresentation:relativeTo:isAbsolute:)
采用 Data
参数,是的,但是该数据应该是 [=28= 的 ASCII 表示] string,不是你要播放的实际数据
您需要做的是将您的视频数据保存到一个文件中,并使用该文件的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)
}
}
}