问题标签 [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 - create CMSampleBuffer from CVPixelBuffer
I am provided with pixelbuffer, which I need to attach to rtmpStream object from lf.swift library to stream it to youtube. it looks like this: rtmpStream.appendSampleBuffer(sampleBuffer: CMSampleBuffer, withType: CMSampleBufferType)
So, I need to convert somehow CVPixelbuffer to CMSampleBuffer to append to rtmpStream.
but, unfortunately this doesn't work. Streaming library is tested and works fine when I stream camera input or screenCapture. I think problem may be sampleTimingInfo, because it requrires decodeTime and Duration which I have no idea how to get for provided CVPixelBuffer.
ios - 检查 CVPixelBufferRef 是否有白色像素的最有效方法是什么?
检查 CVPixelBufferRef 是否有白色像素的最有效方法是什么?
下面是我目前正在使用的代码,但当照片明显有白色像素时,它不会返回白色像素。
ios - 如何将 CVPixelBuffer / CVImageBuffer 转换为数据?
我的相机应用程序捕捉照片,以某种方式增强并保存它。
为此,我以 CVPixelBuffer(包装在 CMSampleBuffer 中)的形式从相机获取输入图像。我对像素缓冲区进行了一些修改,然后我想将其转换为 Data 对象。我该怎么做呢?
请注意,我不想将像素缓冲区/图像缓冲区转换为 UIImage 或 CGImage,因为它们没有元数据(如 EXIF)。我需要一个数据对象。如何从 CVPixelBuffer / CVImageBuffer 中获取一个?
PS:我试过打电话AVCapturePhotoOutput.jpegPhotoDataRepresentation()
,但没有说“不是JPEG样本缓冲区”。这是有道理的,因为 CMSampleBuffer 包含一个像素缓冲区(位图),而不是 JPEG。
swift - FBSimulatorControl : 将 CVPixelBufferRef 数据转换为 jpeg 数据以进行流式传输
我正在快速开发一个 CLI 并在其中使用 FBSimulatorControl。我想流式传输从 consumeData: 委托方法获得的数据。根据方法中获取的数据是从 CVPixelBufferRef 获取的数据
我在 FBSimulatorControl 的 github 存储库中记录了一个问题。
我尝试从数据中重新生成 CVPixelBuffer 并尝试从中获取 CIImage 并将其转换为 jpeg 数据。但这似乎不起作用。谁能帮我这个?在我尝试过的代码下面添加
ios - AVAssetWriterInput 追加失败,错误代码 -11800 AVErrorUnknown -12780
我正在尝试使用 AVCaptureSession 在内存中捕获相机视频,以便以后可以将视频数据写入电影文件。虽然我已经能够成功启动捕获会话,但我无法使用 AVAssetWriter 将捕获的 CMSampleBuffers 成功写入压缩电影文件。
使用 AVAssetWriterInput 的 append 方法附加样本缓冲区失败,当我检查 AVAssetWriter 的错误属性时,我得到以下信息:
错误域=AVFoundationErrorDomain 代码=-11800“操作无法完成” UserInfo={NSUnderlyingError=0x17005d070 {错误域=NSOSStatusErrorDomain 代码=-12780“(null)”},NSLocalizedFailureReason=发生未知错误(-12780),NSLocalizedDescription =操作无法完成}
据我所知,-11800 表示 AVErrorUnknown,但是我无法找到有关 -12780 错误代码的信息,据我所知,这是未记录的。下面我将主要文件粘贴到我设置的示例项目中以演示该问题。
任何指导将不胜感激。谢谢!
ViewController.swift
CVPixelBuffer+Copy.swift:
CMSampleBuffer+Copy.swift:
objective-c - 在 SceneKit 下可靠访问和修改捕获的相机帧
我尝试将黑白滤镜添加到 ARSCNView 的相机图像中,然后在其上渲染彩色 AR 对象。
我几乎在那里,在开头添加了以下代码- (void)renderer:(id<SCNSceneRenderer>)aRenderer updateAtTime:(NSTimeInterval)time
这在移动设备上运行得非常快,但事情是这样的:有时会显示一个彩色框架。我已经检查并执行了我的过滤代码,但我认为为时已晚,SceneKit 的管道已经处理了相机输入。
早点调用代码会有所帮助,但updateAtTime
最早可以逐帧添加自定义代码。
获取有关帧捕获的通知可能会有所帮助,但看起来整个AVCapturesession 都无法访问。
Metal ARKit 示例展示了如何将相机图像转换为 RGB,这就是我要进行过滤的地方,但是在使用 SceneKit 时该着色器被隐藏了。
我已经尝试过这个可能的答案,但它太慢了。
那么如何克服帧丢失并将相机馈送可靠地转换为 BW 呢?
macos - 将 CVPixelBuffer 渲染到 NSView (macOS)
我有一个CVPixelBuffer
我正在尝试有效地在屏幕上绘制的东西。
转化为NSImage
作品的效率不高,但速度很慢,丢掉了大约 40% 的帧。
因此,我尝试使用CIContext
's在屏幕上渲染它drawImage:inRect:fromRect
。使用谁的视图进行CIContext
了初始化,该NSOpenGLContext
视图设置为我的 VC 的视图。当我有一个新图像时,我调用drawImage
不会吐出任何错误的方法......但也不会在屏幕上显示任何内容(当我的上下文设置不正确时它确实记录了错误)。
我试图找到一个如何在 MacOS 上完成此操作的示例,但现在一切似乎都适用于 iOS。
编辑:
这是我正在使用的一些代码。我省略了不相关的部分
在viewDidLoad
我初始化 GL 和 CI 上下文时
然后,当一个新框架准备好时,我会:
我不确定我在正确的地方调用 draw,但我似乎无法找出这应该去哪里。
avplayer - 金属渲染循环优化
我正在寻找有关如何正确实现金属渲染循环的方向。我的渲染循环从AVPlayer
.
这是我当前的实现:
- A以 60hz 的频率
CVDisplayLink
查询播放器的。AVPlayerItemVideoOutput
如果有一个新帧,它会CVPixelBufferRef
被捕获/保存*作为MTKView
它将被渲染到的属性。(此时,之前捕获的视频帧被释放)。 - My
MTKView
设置为isPaused
和enableSetNeedsDisplay
toNO
。换句话说,内部计时器的MTKView
任务是定期调用其drawRect
方法。 - 在
drawRect
我首先将 new-arrived* 转换CVPixelBuffer
为 aMTLTexture
,然后出现一堆渲染阶段。 - 最后,我
presentDrawable
在方法结束时调用drawRect
。
*注意:对 的互斥访问CVPixelBufferRef
由一对 dispatch_semaphore_wait
和控制dispatch_semaphore_signal
。
这是一种正确的做事方式吗? 尽管偶尔会丢失一些帧,但它似乎相当高效。在时间方面,Metal 的 Xcode 分析告诉我,我MTLCommandBuffer
的运行时间通常不到 3 毫秒。
话虽如此,我看到了一些替代的可能性:
- 放弃
CVDisplayLink
实现并抓住其中的框架drawRect
- 反转渲染过程;显示之前捕获的帧并
MTLTexture
首先在drawRect
方法中渲染,然后commit
是 Metal 命令缓冲区并presentDrawable
立即调用。在那之后,捕获下一个视频帧并在下一次调用之前运行它的渲染阶段(在退出drawRect
之前这样做吗?)。drawRect
另一个问题:我的印象是CVDisplayLink
和drawRect
方法都没有在这个配置的主线程上运行。我感到困扰的是,每当我松开应用程序的一个菜单时,视频帧的传递就会出现明显的卡顿——这是主线程进行 UI 更新并阻塞的症状。NSCollectionView
当重新加载屏幕并在屏幕上显示其内容时,会观察到相同的行为。这让我相信我的假设是不正确的。如何MTKView
制作这些渲染循环来避免这些问题? 想知道整个打开/配置是否也AVPlayer
需要脱离主线程。
更新#1
我修复了鼠标悬停在任何项目上时会出现的“另一个问题”口吃问题。NSMenu
这是我的解决方案:
MTKView
用isPaused=YES
和配置每个enableSetNeedsDisplay=NO
。这意味着draw
视图需要显式调用才能呈现其内容。- 在
CVDisplayLink
回调中,发出对on a的draw
调用,因此:MTKView
dispatch_global_queue