如何让 AVPlayer 在暂停时重绘当前 AVItem videoComposition

2024-02-20

我正在为 macOS 构建一个简单的视频编辑器:电影文件作为 AVAsset 加载,由 AVVideoComposition 中的一系列 CIFilter 进行转换,并由 AVPlayer 播放。我展示了 CIFilter 的一些参数的 UI 控件。

当视频播放时,一切正常,我滑动滑块,效果发生变化!但是,当视频暂停时,在 UI 中的控件更改后,AVPlayerView 不会重新绘制。

如何鼓励 AVPlayerView 在暂停时重新绘制当前项目的 videoComposition 内容?

class ViewController: NSViewController {

    @objc @IBAction func openDocument(_ file: Any) { ... }

    @IBOutlet weak var moviePlayerView: AVPlayerView!

    var ciContext:CIContext? = CIContext(mtlDevice: MTLCreateSystemDefaultDevice()!)

    var sliderValue: Double = 0.0

    @IBAction func sliderMoved(_ sender: NSSlider) {
        self.sliderValue = sender.doubleValue
        // need to update the view here when paused
        self.moviePlayerView.setNeedsDisplay(self.moviePlayerView.bounds)
        // setNeedsDisplay has no effect.
    }

    func loadMovie(file: URL) {
        let avMovie = AVMovie(url: file)
        let avPlayerItem = AVPlayerItem(asset: avMovie)

        avPlayerItem.videoComposition = AVVideoComposition(asset: avMovie) { request in
            let output = request.sourceImage.applyingGaussianBlur(sigma: self.sliderValue)
            request.finish(with: output, context: self.ciContext)
        }

        self.moviePlayerView.player = AVPlayer(playerItem: avPlayerItem)
    }
}

事实证明重新设置 AVPlayerItem 的videoComposition属性将触发项目重绘。即使您将属性设置为其当前值,这也有效:item.videoComposition = item.videoComposition。属性设置器似乎具有未记录的副作用。

要修复上面的示例代码,请执行以下操作:

@IBAction func sliderMoved(_ sender: NSSlider) {
    self.sliderValue = sender.doubleValue
    // update the view when paused
    if self.moviePlayerView.player?.rate == 0.0 {
        self.moviePlayerView.player?.currentItem?.videoComposition = self.moviePlayerView.player?.currentItem?.videoComposition
    }
}

希望有人觉得这很有用!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 AVPlayer 在暂停时重绘当前 AVItem videoComposition 的相关文章

随机推荐

  • 无法获取 UWP 中 ColumnDefinitionCollection 的“Add”方法

    在 Windows 通用应用程序的上下文中 并使用反射 我试图获取Add方法从一个ColumnDefinitionCollection 内置型 所以我用这个 type GetRuntimeMethods First info gt info
  • csproj 文件中的 XML

    任何人都可以向我指出 C csproj 文件中有效的架构或属性列表吗 我看过了 但似乎找不到任何有关它的文档 你的意思是像this http msdn microsoft com en us library dd576348 aspx文档
  • Keras 干扰 python 日志记录

    我想记录一些加载到经过训练的 keras 模型中的 python 代码 由于某种原因 python 日志记录在 keras 不工作的情况下不起作用load model是进口的 但是 如果我不导入 keras python 日志记录工作正常
  • PHP PDO + 准备语句

    sql SELECT phrase english FROM static site language WHERE page pds database gt pdo gt prepare sql pds gt execute array P
  • 弹出 Landscape-only 后 ViewController 的方向错误

    在基于导航的应用程序中 LandscapeViewController 仅支持横向模式 所有其他应用程序都支持两种模式 我还有一个 加载屏幕 建议用户在继续之前旋转手机 这样我可以确保当我的横向视图加载时 它处于横向模式 当我将手机旋转到纵
  • 偏航、俯仰和横滚分别与航向、俯仰和倾斜相同吗?

    我有两个不同的系统 引擎 A 引擎 B 发动机A 动机追踪软件 生成 偏航 俯仰 滚转 和发动机 B 4D影院 期望 航向 俯仰 坡度 我的研究得出的结果是这两个系统之间没有区别 Yaw Pitch Roll Heading Pitch B
  • React:为什么组件的构造函数只被调用一次?

    In the 下面的例子 http codepen io anon pen VYVPBJ when Item 2被点击 Second 1显示而不是Second 2 为什么 你会如何解决这个问题 var guid 0 class Conten
  • C# WinForms ListView 项目计数更改事件

    当 ListView 中的项目数发生变化时 Win Forms 中是否有一个事件可以触发 我尝试了 大小 和 文本 奇怪的是 它们 有点 有效 但并不总是 我试图触发一个标签来更新列表视图项目的计数 因为它发生变化 而无需在一百种方法中手动
  • 未找到 Browserify 命令

    简单的问题 当我从 mac 终端运行 browserify index js o app js 时 我得到命令未找到 我已经完成了 npm install g browserify 但仍然没有运气 知道我为什么会收到这个吗 谢谢 对我来说
  • Android:通过 adb shell am 启动应用程序信息对话框

    我正在尝试编写一个脚本 它将通过 adb 为我正在测试的应用程序启动 应用程序信息 系统对话框 我做了一些调查并提出了这个命令 它将启动 应用程序信息 但会因强制关闭而失败 logcat 中的 NullPointerException ad
  • “git config --list”显示重复的名称

    git config list显示两个值user name 一个全局 一个本地 user name My Name user name My Other Name 我的理解是 本地价值观优先于全球价值观 我怎样才能得到git config仅
  • 子div高度100%内部位置:固定div + 自动溢出

    我在尝试以下操作时遇到一些奇怪的行为 请参阅jsfiddle http jsfiddle net 9nS47 http jsfiddle net 9nS47 HTML div div div div div div div div div
  • JAR 中存在类,但仍然“无法找到或加载主类”

    我下载并安装了UMD 的 FindBugs 3 0 http findbugs sourceforge net downloads html in usr local share findbugs 3 0 ls usr local shar
  • 在android中的按钮上设置图像?

    我一直在尝试使用以下代码在按钮上设置图像 但它似乎不起作用 我认为我做错的是我正在使用的图像的路径 但我尝试了不同的路径 但它不会工作 我已将图像复制到 res 文件夹中的可绘制文件夹中 我在这里做错了什么 final Button nex
  • 将外部应用程序移动到屏幕前面

    我正在运行的应用程序需要调用单独的应用程序来进行一些扫描 我通过启动一个新的应用程序来调用另一个应用程序System Diagnostics Process 一旦获得该流程 我就会调用一个方法来让该应用程序获得焦点 我尝试了两种不同的方法来
  • 在 r 中跨多个数据帧应用一组操作

    我一直在为我的项目学习 R 但无法在 google 上找到我当前问题的解决方案 我有大约 100 个 csv 文件 需要对它们执行一组精确的操作 我已将它们作为单独的对象读取 我认为这可能是不正确的 r 风格 但我无法编写可以循环的函数 每
  • IText 2 + Flying Saucer:如何避免两个pdf页面之间的图像出现损坏?

    我有一个 html 文件 我正在使用 Itext 2 和飞碟将其转换为 pdf 文件 问题是 如果图像在页面末尾附近开始 飞碟会将其中的一部分渲染到当前页面的末尾 并将其余部分渲染到下一页的开头 怎么说我只想将整个图像放在一页上 您可以将其
  • 如何在 ASP.NET 应用程序中查询 Word docx?

    我想将 Word 2007 或更高版本的 docx 文件上传到我的 Web 服务器 并将目录转换为简单的 xml 结构 使用传统 VBA 在桌面上执行此操作似乎很容易 查看用于创建 docx 文件的 WordprocessingML XML
  • Jenkins - 使用 Git 插件请求登录凭据

    我有几个工作从 bitbucket 中提取代码并在 jenkins 中构建它 我使用 Git 插件来指定存储库 URL git 凭据 尽管我在每个作业配置中设置了凭据 但每次推送到 bitbucket 触发 jenkins 作业 时 Mac
  • 如何让 AVPlayer 在暂停时重绘当前 AVItem videoComposition

    我正在为 macOS 构建一个简单的视频编辑器 电影文件作为 AVAsset 加载 由 AVVideoComposition 中的一系列 CIFilter 进行转换 并由 AVPlayer 播放 我展示了 CIFilter 的一些参数的 U