ios - 在 iOS 13 上暂停时强制重绘 AVPlayerLayer
问题描述
我使用 CoreImage 将实时效果应用于使用 AVPlayer 播放的视频。问题是当播放器暂停时,如果您使用滑块调整过滤器参数,则不会应用过滤器。
let videoComposition = AVMutableVideoComposition(asset: asset, applyingCIFiltersWithHandler: {[weak self] request in
// Clamp to avoid blurring transparent pixels at the image edges
let source = request.sourceImage.clampedToExtent()
let output:CIImage
if let filteredOutput = self?.runFilters(source, filters: array)?.cropped(to: request.sourceImage.extent) {
output = filteredOutput
} else {
output = source
}
// Provide the filter output to the composition
request.finish(with: output, context: nil)
})
作为一种解决方法,我使用了这个在 iOS 12.4 之前有效的答案,但在 iOS 13 beta 6 中不再有效。寻找适用于 iOS 13 的解决方案。
解决方案
在将此作为错误报告给 Apple 并获得一些有用的反馈后,我有一个修复:
player.currentItem?.videoComposition = player.currentItem?.videoComposition?.mutableCopy() as? AVVideoComposition
我得到的解释是:
当 AVPlayerItem 的 videoComposition 属性获得一个新实例时,AVPlayer 会重新绘制一个帧,或者即使它是同一个实例,该实例的属性已被修改。
因此; 强制重绘可以通过简单地复制现有实例来创建“新”实例来实现。
推荐阅读
- .net - 我有没有机会使用 websocket 连接到 MS Teams,以便我可以在 MS Teams 的频道中获得实时消息?
- sql - 为给定用例建议 SQL 查询
- c# - 在 WinForms DataGrid 中为特殊字符(而不是空格)换行
- android - parentFragmentViewModel 如何与 subFragmentViewModel 通信?
- google-sheets - Google Refresh_token 过期后不会生成访问令牌。Refresh_token 无法创建新的 Access_token
- qt - QML ProgressBar 无效的属性名称“样式”
- css - 带有 setTimeout 的映射函数不返回 JSX 元素
- android - Android 中的推送通知仅在 PhoneGap 应用程序在前台使用 node-pushnotifications 时有效
- google-chrome - javascript 任务在完成帧的中间运行
- python - 如何使用 h5py 将值并行添加到具有 3 个组和每组 12 个数据集的现有 HDF5 文件?