【问题标题】:AV Capture Contents of a *View* to a MovieAV 将 *View* 的内容捕获到电影
【发布时间】:2016-10-11 13:08:41
【问题描述】:

我知道如何使用 AVFoundation 将 screen 的内容捕获到电影文件中,但我想改为捕获 NSView 的内容。我的应用程序在视图中做了一些事情,目前要生成一个电影文件,我必须记录整个屏幕(当然是裁剪的)。如果应用程序可以在后台并且仍在记录会话,那么用户会更容易。我考虑过可能创建一个假屏幕并尝试在那里反映视图的内容,但这似乎过于复杂。

【问题讨论】:

  • 您是在视图中显示-drawRect 还是图层树?
  • 视图实际上是一个网络视图。我正在尝试捕获 Electron 应用程序内容的内容。

标签: macos avfoundation


【解决方案1】:

我使用 CARenderer 将纯 CALayer 树转换为旧式 OpenGL 上下文到 CVOpenGLTextureCache / AVAssetWriter,然后将其显示到常规 GL 视图或层以供显示,我已经取得了一些成功。

然而,旧的渲染器有一些怪癖,所以你可能需要稍微调整一下才能让它在视网膜等上工作。没有尝试过合适的 NSView 树,CA 维护人员对它的工作感到惊讶在WWDC。所以未来的支持可能会受到限制。

不过,这似乎是一个很好的要求,我很乐意参考您的雷达。

【讨论】:

    【解决方案2】:

    AFAICR,没有明确的 API 来捕获 NSView。你需要做的是逐帧渲染它,或者如果视图的有趣内容都是基于层的,使用AVVideoCompositionCoreAnimationTool

    前一种方法(逐帧渲染)可能会很慢,并且某些合成方法会在软件渲染器中渲染不正确。归结为使用AVAssetWriterAVAssetWriterInputPixelBufferAdaptor,并为其提供框架。创建一个与CGBitmapContext 共享内存的像素缓冲区,然后从这些像素缓冲区创建样本缓冲区,然后将这些样本缓冲区输入资产写入器管道,然后将该资产写入到磁盘作为 m4v 文件。

    后一种(渲染一些核心动画)方法是……很多工作。需要更多地了解正在呈现的内容以提出确切的方法。

    【讨论】:

    • AVVideoCompositionCoreAnimationTool 的文档说“避免使用与UIView 对象关联的层。”我的理解是该工具将成为图层的父级,使其不再适合显示 NSView 的内容。
    猜你喜欢
    • 2011-05-14
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多