我正在制作一个录制视频的应用程序,使用带有 CKAsset 的 CloudKit 将其上传到 iCloud,然后下载文件并在 AVPlayer 中播放。这都是用 Swift 2.0 编写的
我已经下载了数据,我想我已经能够参考它,但我不确定。当我将 URL 转换为 NSData 对象并将其打印到控制台时,数据/垃圾确实会打印。然而,视频文件作为二进制文件下载。我能够转到 CloudKit 仪表板并下载文件并将“.mov”附加到它,并且它在 Quicktime 中打开没问题。
所以我认为我的主要问题是我无法弄清楚如何让视频文件实际播放,因为该文件没有扩展名。我曾尝试使用 URLByAppendingPathExtension() 将 '.mov' 附加到末尾,但无济于事。让我知道任何想法!
上传视频
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
let tempURL = info[UIImagePickerControllerMediaURL] as! NSURL
dismissViewControllerAnimated(true) { () -> Void in
self.uploadVideoToiCloud(tempURL)
print("\n Before Upload: \(tempURL)\n")
}
}
func uploadVideoToiCloud(url: NSURL) {
let videoRecord = CKRecord(recordType: "video", recordID: id)
videoRecord["title"] = "This is the title"
let videoAsset = CKAsset(fileURL: url)
videoRecord["video"] = videoAsset
CKContainer.defaultContainer().privateCloudDatabase.saveRecord(videoRecord) …Run Code Online (Sandbox Code Playgroud) 我有一个包含全宽的单元格UIImageView,我正在创建一个AVPlayerLayer来播放内嵌视频。这几乎完美地工作,唯一的问题是当它被添加到previewImage图像视图时,这是一个完美显示的全宽图像视图,它的左侧和右侧有 1 px 的间隙。因此,当视频播放时,您可以真正注意到它并且非常刺耳。
我是这样设置的:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
let cell = tableView.cellForRow(at: indexPath) as! GameMediaCell
if (cell.playerLayer != nil) {
cell.playerLayer?.player?.pause()
cell.playerLayer?.removeFromSuperlayer()
cell.playerLayer = nil
} else {
if let clipURI = viewModel?.mediaURIForIndex(indexPath.row) {
let player = AVPlayer(url: clipURI)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = cell.previewImage.frame
cell.previewImage.layer.addSublayer(playerLayer)
cell.playerLayer = playerLayer
playerLayer.player?.play()
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有两个AVPlayer()项目播放相同持续时间(10 秒)的视频。目标是让它们循环并彼此保持同步。我将它们添加为相同的子层,UIView然后调用player.play()它们中的每一个。
但问题是,由于代码执行显然有最轻微的延迟,因为一个在另一个之后调用,视频不同步(虽然只有几毫秒,但很明显)。
正如我看到其他帖子所建议的那样,我没有创建 AVMutableComposition 的选项,那么无论如何要让两个独立的播放器真正保持同步并完全同时播放?
谢谢!
我正在开发一个 iOS 无线电应用程序。当网络连接良好时,应用程序运行正常。
我的情况略有不同。我限制了 iPhone 中的移动数据速度(设置 -> 开发人员 -> 网络链接调节器),并从列表中选择了较差的网络选项。此时,播放器正在尝试流式传输音频内容,如果我尝试呈现或关闭视图控制器,则应用程序会变慢或挂起。我尝试从主队列中呈现视图控制器,但这不起作用。
let requestedKey = ["playable","duration"]
asset.loadValuesAsynchronously(forKeys: requestedKey) {
DispatchQueue.main.async{
var error: NSError?
let keyStatus = asset.statusOfValue(forKey: "playable", error: &error)
if keyStatus == AVKeyValueStatus.failed || !asset.isPlayable {
completionHandler(false, nil)
return
}
completionHandler(true, asset)
}
}
if player == nil {
player = AVPlayer()
}
playerItem = AVPlayerItem(asset: asset)
Run Code Online (Sandbox Code Playgroud)
这就是我设置播放器的方式。当连接较差或边缘时,请帮助我解决这个严重的性能问题。
我在屏幕上并排播放两个视频,所以我有两个 AVPlayer 实例。我正在使用工作正常的通知检测视频播放结束。我的选择器(playerDidFinishPlaying)在两个视频结束时都被调用。
NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil)
Run Code Online (Sandbox Code Playgroud)
现在我的问题出在选择器(playerDidFinishPlaying)中,我想检测它调用了哪个 avplayer?如何唯一识别视频结束的 AVPlayer?