我正在使用 AVCaptureDataOutputSynchronizerDelegate 来处理视频、深度和元数据的捕获数据
private let videoDataOutput = AVCaptureVideoDataOutput()
private let depthDataOutput = AVCaptureDepthDataOutput()
private let metadataOutput = AVCaptureMetadataOutput()
因此,使用下面的代码,我能够在 AVCaptureDataOutputSynchronizerDelegate 使用的委托(delegate)方法中获取特定的视频数据。
func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer, didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
guard let syncedVideoData = synchronizedDataCollection.synchronizedData(for: self.videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else { return }
问题是,当我尝试将 videoData 保存到如下数组中时,我得到了 OutOfBuffers错误。如果我尝试保存视频数据/相关图像/与此数据相关的任何内容,此问题仍然存在。
let array:[CMSampleBuffer] = []
...
array.append(syncedVideoData)
//Gets to about 5-6 sets of data, then it runs out of buffers.
//I think the buffer is being retained permanently since I am saving to a global variable here.
//Leading to out of buffer error
所以,我想发生的事情是,因为我将任何相关数据保存到一个数组中,它会将数据保留在内存中的缓冲区中,而它通常会被释放。
webpage linked earlier for OutOfBuffers表示我可以
If you need to perform extended processing of captured data, copy that data into buffers whose lifetimes you manage instead of relying on buffers vended by the capture output.
我试图创建一个新的 CMSampleBuffer
extension VideoCapture: AVCaptureDataOutputSynchronizerDelegate {
func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer, didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
var newData:CMSampleBuffer?
guard let syncedVideoData = synchronizedDataCollection.synchronizedData(for: self.videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else { return }
guard !syncedVideoData.sampleBufferWasDropped else {
print(syncedVideoData.droppedReason.rawValue)
return
}
let videoSampleBuffer = syncedVideoData.sampleBuffer
CMSampleBufferCreateCopy(allocator: kCFAllocatorDefault, sampleBuffer: videoSampleBuffer, sampleBufferOut: &newData)
if(newData != nil) {
self.buffer.append(newData!)
}
}
但这会导致相同的问题——videoData 仍保留在缓冲区中。我获得了大约 5-6 组 videoData,然后就没有更多的数据了。
有关如何“将数据复制到您管理其生命周期的缓冲区,而不是依赖于捕获输出提供的缓冲区”的任何指导。,如 the outOfBuffers website 中所示?
最佳答案
我能够在 this buffer 之后创建缓冲区和 this guide以及 Apple 文档中的其他一些内容。
...
guard let imagePixelBuffer = CMSampleBufferGetImageBuffer(videoSampleBuffer) else { fatalError() }
//First lock buffer
CVPixelBufferLockBaseAddress(imagePixelBuffer,
CVPixelBufferLockFlags.readOnly)
//Do something with buffer
self.buffer = createMyBuffer(pixelBuffer: imagePixelBuffer)
//Unlock buffer
CVPixelBufferUnlockBaseAddress(imagePixelBuffer,
CVPixelBufferLockFlags.readOnly)
self.doSomething(self.buffer)
...
func createMyBuffer(pixelBuffer: CVPixelBuffer) -> CVPixelBuffer? {
let scaleWidth:Int = CVPixelBufferGetWidth(pixelBuffer)
let scaleHeight:Int = CVPixelBufferGetHeight(pixelBuffer)
let flags = CVPixelBufferLockFlags(rawValue: 0)
guard kCVReturnSuccess == CVPixelBufferLockBaseAddress(pixelBuffer, flags) else {
return nil
}
defer { CVPixelBufferUnlockBaseAddress(pixelBuffer, flags) }
guard let srcData = CVPixelBufferGetBaseAddress(pixelBuffer) else {
print("Error: could not get pixel buffer base address")
return nil
}
let srcBytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
var srcBuffer = vImage_Buffer(data: srcData,
height: vImagePixelCount(CVPixelBufferGetHeight(pixelBuffer)),
width: vImagePixelCount(CVPixelBufferGetWidth(pixelBuffer)),
rowBytes: srcBytesPerRow)
let destBytesPerRow = scaleWidth*4
guard let destData = malloc(scaleHeight*destBytesPerRow) else {
print("Error: out of memory")
return nil
}
var destBuffer = vImage_Buffer(data: destData,
height: vImagePixelCount(scaleHeight),
width: vImagePixelCount(scaleWidth),
rowBytes: destBytesPerRow)
let error = vImageScale_ARGB8888(&srcBuffer, &destBuffer, nil, vImage_Flags(kvImageLeaveAlphaUnchanged))
if error != kvImageNoError {
print("Error:", error)
free(destData)
return nil
}
let releaseCallback: CVPixelBufferReleaseBytesCallback = { _, ptr in
if let ptr = ptr {
free(UnsafeMutableRawPointer(mutating: ptr))
}
}
let pixelFormat = CVPixelBufferGetPixelFormatType(pixelBuffer)
var dstPixelBuffer: CVPixelBuffer?
let status = CVPixelBufferCreateWithBytes(nil, scaleWidth, scaleHeight,
pixelFormat, destData,
destBytesPerRow, releaseCallback,
nil, nil, &dstPixelBuffer)
if status != kCVReturnSuccess {
print("Error: could not create new pixel buffer")
free(destData)
return nil
}
return dstPixelBuffer
}
这有效 - 但似乎多余。我正在使用一个函数,我发现它可以“缩放”缓冲区,但我只是将它缩放到与当前缓冲区完全相同的大小,它会返回一个新的缓冲区,当我选择删除它时。它是重复的,但功能有效。
关于swift - 由于缓冲区不足,从 AVCaptureDataOutputSynchronizerDelegate 中适当释放缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57134958/
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro
我正在尝试为文件操作编写自己的DSL,只是为了学习。我的目标是让它易于理解和编码。这里有3种将字符串附加到database.yml的替代方法:1.append("windows").to("database.yml")2.append(string:"windows").to(file:"database.yml")3.append_string("windows").to_file("database.yml")4.append_string"windows",to_file:"database.yml"5.appendstring:"windows",to_file:"databa
我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串
我目前正在开发一个ruby应用程序,但它运行得非常(非常!)慢..到目前为止,我已经尝试了几件事,我可以将其缩小到主要问题:Ruby正在尝试在$LOAD_PATH的每个目录中查找它的需求。基本上我所观察到的是,ruby正在查看大量文件,试图查看那里是否存在需求。如果找不到它们,它将转到下一个目录。好消息是我可以通过strace看到这种情况。有很多这样的输出:open("/boa_proj_build/nsteen/.gem/gems/i18n-0.7.0/lib/commander/help_formatters/base.rb",O_RDONLY|O_CLOEXEC)=-1ENO
视频教程:https://www.bilibili.com/video/BV1WJ411778C/?spm_id_from=333.999.0.0&vd_source=4a4c35da6aef7094d5990c213c39aa09使用素材(推荐使用GitZipforgithub下载):https://github.com/zheyuanzhou/Youtube-Unity-Tutorial/tree/master/EP45_Health%20Bar/Sprites效果如下图所示:首先在场景中创建一个新的Canvas,并命名为HeathBar,并创建三个Image作为前者的子物体,分别命名为
我在安装bundle时遇到这些错误:✗bundleinstallFetchinggemmetadatafromhttps://rubygems.org/.........Resolvingdependencies...Bundler::GemspecError:Couldnotreadgemat/Users/liuxin/.rvm/gems/ruby-1.9.3-p547/cache/i18n-0.6.11.gem.Itmaybecorrupted.Anerroroccurredwhileinstallingi18n(0.6.11),andBundlercannotcontinue.M
我有一个RaspberryPiTFT7"触摸屏显示器,我想创建一个简单的应用程序来显示和输出系统数据(即CPU使用率、温度等)。我注意到目前常见的实现方法是使用pygame库输出到显示器连接到的帧缓冲区/dev/fb1。我想执行相同的操作,但使用Ruby,因为我更熟悉这门语言。有人可以为我指明正确的方向,让我知道如何开始吗?我查看了rubygame和gosu库,它们似乎能够做我想做的事情,即绘制屏幕,但我找不到任何关于如何将输出定向到的信息帧缓冲区本身。 最佳答案 rubycorelib有一个IO您应该能够使用该类将输出定向
我将一个使用1.8.7的网络应用程序移到了1.9.2,现在我一直在使用incompatiblecharacterencodings:ASCII-8BITandUTF-8我有UTF-8的数据库编码,我还有'config.encoding="utf-8"'。我看到了一些想法作为可能的解决方法并添加了Encoding.default_external=Encoding::UTF_8Encoding.default_internal=Encoding::UTF_8但是也没用。出现此错误的一段特定代码是%ul.address-@user.address.split(',').eachdo|lin