首页 > 解决方案 > 无法在 Apple Silicon (M1) 上的 SceneKit 中将 AVCaptureVideoPreviewLayer 设置为漫反射内容

问题描述

我正在尝试AVCaptureVideoPreviewLayer在 SceneKit 材质上显示一个。

编辑:预览层的内容来自我的 USB 连接的 iOS 设备。

  1. 下面链接的代码我使用NSView' 层时有效,因此该部分应该没问题
  2. 整个事情似乎适用于英特尔,但不适用于 Apple Silicon
  3. 整个项目都在这里——所有代码都在ViewController

怎么了?

错误访问崩溃。 在此处输入图像描述 在此处输入图像描述

我尝试了什么?

  1. 使用NSView' 层 - 有效
  2. 未在图层上设置大小 - 金属崩溃(高度为 0,宽度为 0 - 这在 Big Sur 中是预期的)
  3. 将图层的大小设置为与输入端口尺寸完全相同的大小 - 相同的崩溃
  4. 确保图层未显示在其他位置(如您将在代码中看到的那样)

更新:这是detach在 lldb 中运行的崩溃日志: https ://gist.github.com/mortenjust/4470c8e9e8ca1dc3043388b8b2886703

标签: swiftcocoaavfoundationscenekit

解决方案


从崩溃日志中得知

  1. 崩溃是由 ASan 触发的(参见AddressSanitizer
  2. 哪个libMTLCapture.dylib是Xcode中用来调试Metal的库

我会禁用 Xcode 中的 GPU 帧捕获调试选项,看看崩溃是否消失。如果是这样,我会向 Apple 提交反馈。

Thread 2 Crashed:: Dispatch queue: com.apple.root.default-qos
0   libsystem_kernel.dylib          0x00000001826c0cec __pthread_kill + 8
1   libsystem_pthread.dylib         0x0000000103beb384 pthread_kill + 292
2   libsystem_c.dylib               0x0000000182639864 abort + 104
3   libclang_rt.asan_osx_dynamic.dylib  0x0000000102be5e4c __sanitizer::Abort() + 64
4   libclang_rt.asan_osx_dynamic.dylib  0x0000000102be5788 __sanitizer::Die() + 208
5   libclang_rt.asan_osx_dynamic.dylib  0x0000000102bcf238 __asan::ScopedInErrorReport::~ScopedInErrorReport() + 420
6   libclang_rt.asan_osx_dynamic.dylib  0x0000000102bcd06c __asan::ReportDeadlySignal(__sanitizer::SignalContext const&) + 148
7   libclang_rt.asan_osx_dynamic.dylib  0x0000000102bcc950 __asan::AsanOnDeadlySignal(int, void*, void*) + 96
8   libsystem_platform.dylib        0x0000000182739c44 _sigtramp + 56
9   libMTLCapture.dylib             0x0000000103a96eb0 0x1039e0000 + 749232
10  com.apple.SceneKit              0x00000001a0ac1d50 __92-[SCNTextureCoreAnimationSource _resizeLayer:toSize:updateLayer:updateTransform:caRenderer:]_block_invoke + 824
11  libclang_rt.asan_osx_dynamic.dylib  0x0000000102bc7e28 __wrap_dispatch_group_async_block_invoke + 188
12  libdispatch.dylib               0x0000000103b401d8 _dispatch_call_block_and_release + 32
13  libdispatch.dylib               0x0000000103b41d20 _dispatch_client_callout + 20
14  libdispatch.dylib               0x0000000103b58d04 _dispatch_root_queue_drain + 1664
15  libdispatch.dylib               0x0000000103b5939c _dispatch_worker_thread2 + 140
16  libsystem_pthread.dylib         0x0000000103be74b8 _pthread_wqthread + 216
17  libsystem_pthread.dylib         0x0000000103be6228 start_wqthread + 8

推荐阅读