问题标签 [cvpixelbuffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - 访问已使用 Padding 扩展的 CVPixelBuffer 之外的像素
我正在尝试扩展 CVPixelBuffer,以便通过使用填充重新初始化 CVPixelBuffer 来访问缓冲区外部的内存不会导致 EXC_BAD_ACCESS 错误。但是,它似乎不起作用。任何关于我做错了什么的提示将不胜感激。
使用扩展的 CVPixelBuffer,访问 CVPixelBuffer 之外的数据(例如当 x,y 为负数或大于缓冲区的宽度/高度时)应该是根据我的理解定义的行为。然而,以下代码在 VImageScale_ARGB8888 内部的最后一行崩溃,EXC_BAD_ACCESS 代码为 1。
这大概意味着正在访问的数据正在被取消映射。
非常感谢!
ios - 如何将 YUV 数据转换为 CVPixelBufferRef?
我有下面的 Yuv 数据:
现在如何将其转换为CVPixelBufferRef
?
opengl - 如何将现有的 OpenGL 纹理转换为金属纹理
我正在为 Motion 和 FCP X 开发一些 FxPlug 插件。最终,我想让它们在 Metal 中渲染,因为 Apple 正在弃用 OpenGL。
我目前正在使用 CoreImage,虽然我已经能够使用 CoreImage 功能在 FxPlug SDK 之外进行金属处理,但 FxPlug 只为我提供了作为 OpenGL 纹理的帧。我试过把它传递给 CoreImage 过滤器,但我最终得到了这个错误:
经过一番研究,我发现我应该可以使用 CVPixelBuffers 在两者之间共享纹理,但是在尝试使用这种方法编写代码一段时间后,我开始相信这是一种编写方式(如,从头开始创建)到共享缓冲区,但不能在两者之间转换。虽然这可能不正确,但我找不到让现有 GL 纹理存在于 CVPixelBuffer 中的方法。
TL; DR:我找到了从 CVPixelBuffer 获取结果 Metal 或 OpenGL 纹理的方法,但我找不到从现有 OpenGL 纹理创建 CVPixelBuffer 的方法。我的心不在这种方法上,因为我的最终目标是简单地从 OpenGL 转换为 Metal,然后再转换回 OpenGL(理想情况下以一种有效的方式)。
有没有其他人找到使用 FxPlug 和 Metal 的方法?有没有一种从 OpenGL 纹理转换为 Metal/CVPixelBuffer 的好方法?
avassetwriter - iOS - AVassetWriter 输出大小为 0 的文件并且不给出错误
我对 swift(和编程)仍然很陌生,我正在尝试将从 ARFrame 获得的 CVPixelbuffer 实时输出到视频中(顶部没有 AR 的东西)。
我已经设置了 AVAssetWriter 和 Input,并在每一帧上尝试附加 CVPixelbuffer(转换为 CMSampleBuffer)。
该代码创建了一个 0 字节的文件并且没有给出任何错误。我不知道出了什么问题,而且文档对于我的级别来说相当神秘。
我很确定每帧的时间戳不正确。但我无法弄清楚每一帧是否需要时间,或者自视频开始以来的总时间。
然后是 cvPixelBuffer 的大小和格式。我也不知道我是否需要告诉 AVAssetwriter 即将到来的数据的大小和格式是什么,或者它是否可以自己解决。
感谢您的时间。
swift - TokBox:使用修改后的像素缓冲区时“consumeFrame”崩溃
我正在尝试将像素缓冲区从实时视频源修改AVFoundation
为流式传输OpenTok's API
。但是每当我尝试这样做并通过 OpenTok 提供它时consumeFrame
,它就会崩溃。
我这样做是为了可以应用不同的实时视频效果(滤镜、贴纸等)。我尝试CGImage->CVPixelBuffer
使用不同的方法进行转换,但没有任何效果。
这是我的CGImage->CVPixelBuffer
方法:
我在第一帧收到此错误:
* 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[NSConcretePointerArray pointerAtIndex:]:尝试访问索引 1 处的指针超出边界 1”
如果你做到了这一步,谢谢你的阅读。我已经在这个问题上停留了一段时间,所以任何类型的指针都将不胜感激。谢谢。
macos - CMSampleBufferGetImageBuffer 为捕获的 JPEG stillImage 返回 nil
我使用JPEG格式捕获Mac屏幕,然后获取捕获的JPEG样本缓冲区的pixelBuffer和imageBuffer。但是,pixelBuffer 始终为零,而当我将 JPEG 缓冲区转换为 NSImage 时,可以成功获取并显示图像。
在 processSampleBuffer 中 self.image 可以得到一个 NSImage 并成功显示在 NSImageView 中。但 imageBuffer 和 pixelBuffer 都是零。
这让我很困惑,有人可以帮忙看看吗?
swift - 为 coreML 模型提供图像时出现运行时异常
我正在尝试学习 Apple 的 CoreML 框架,为此我创建了一个非常简单的 CoreML 模型,该模型将判断图像显示的是苹果还是香蕉。为此,我在 Assets.xcassets 目录中有一个苹果的图像,当我按下一个按钮时,我希望这个图像传递到我的模型中,我希望得到关于它的正确信息。
现在我收到一个错误。我得到的错误是
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
错误在该行旁边
guard let fruitName = try? model.prediction(image: image as! CVPixelBuffer) else{
fatalError("Unexpected runtime error.")
}
我不确定是什么导致了错误。我能想到的唯一原因是我没有正确格式化图像。该模型需要一个 CVPixelBuffer,我不确定我从 UIImage 到 CVPixelBuffer 的转换是否正确。
我究竟做错了什么?
感谢所有帮助!
swift - 如何在 Swift 中直接从 CIImage 而不是 UIImage 制作 CVPixelBuffer?
我正在通过 iPhone 摄像头录制过滤后的视频,在录制时将 CIImage 实时转换为 UIImage 时,CPU 使用率会大幅增加。我制作 CVPixelBuffer 的缓冲区函数使用 UIImage,到目前为止,这需要我进行此转换。如果可能的话,我想创建一个使用 CIImage 的缓冲区函数,这样我就可以跳过从 UIImage 到 CIImage 的转换。我认为这将大大提高录制视频时的性能,因为 CPU 和 GPU 之间不会有任何切换。
这就是我现在所拥有的。在我的 captureOutput 函数中,我从 CIImage 创建了一个 UIImage,它是过滤后的图像。我使用 UIImage 从缓冲区函数创建一个 CVPixelBuffer,并将其附加到assetWriter 的pixelBufferInput:
我使用 UIImage 的缓冲区函数:
ios - WebRTC iOS:从 RTCCameraVideoCapturer 过滤相机流。从 RTCFrame 到 CVPixelBuffer 的转换
我发现下面的git 通过使用func capturer(_ capturer: RTCVideoCapturer, didCapture frame: RTCVideoFrame)
. RTCVideoCapturerDelegate
你得到RTCVideoFrame
然后转换CVPixelBuffer
为修改。
https://gist.github.com/lyokato/d041f16b94c84753b5e877211874c6fc
但是,我发现 Chronium 说获取 PixelBuffer 的 nativeHandle 不再可用(链接如下)。我尝试了 frame.buffer.pixelbuffer ...,但是,查看 framework > Headers > RTCVideoFrameBuffer.h,我发现 CVPixelBuffer 也从这里消失了!
https://codereview.webrtc.org/2990253002
有什么好办法可以转换RTCVideoFrame
吗CVPixelBuffer
?还是我们有更好的方法来修改从 RTCCameraVideoCapturer 捕获的视频?
下面的链接建议直接修改 sdk,但希望我们可以在 Xcode 上实现这一点。