当前位置: 首页 > 面试题库 >

用增强现实录制视频的最佳方法是什么

柯波
2023-03-14
问题内容

用增强现实录制视频的最佳方法是什么?(向iPhone / iPad相机的框架添加文字,图像徽标)

以前,我试图弄清楚如何绘制CIImage并转换CIImageCMSampleBufferCIImage回到CMSampleBuffer中
我几乎做了所有事情,只是在使用new CMSampleBufferin 录制视频时遇到问题AVAssetWriterInput

但是,无论如何,这种解决方案都不是很好,它在转换CIImageCVPixelBufferciContext.render(ciImage!,to: aBuffer))时会占用大量CPU

因此,我想在这里停下来,找到其他方法来录制具有增强现实的视频(例如,在将视频编码为mp4文件的同时,在帧内动态添加(绘制)文本)

在这里,我已经尝试过并且不想再使用了…

// convert original CMSampleBuffer to CIImage, 
// combine multiple `CIImage`s into one (adding augmented reality -  
// text or some additional images)
let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
let ciimage : CIImage = CIImage(cvPixelBuffer: pixelBuffer)
var outputImage: CIImage?
let images : Array<CIImage> = [ciimage, ciimageSec!] // add all your CIImages that you'd like to combine
for image in images {
    outputImage = outputImage == nil ? image : image.composited(over: outputImage!)
}

// allocate this class variable once         
if pixelBufferNew == nil {
    CVPixelBufferCreate(kCFAllocatorSystemDefault, CVPixelBufferGetWidth(pixelBuffer),  CVPixelBufferGetHeight(pixelBuffer), kCVPixelFormatType_32BGRA, nil, &pixelBufferNew)
}

// convert CIImage to CVPixelBuffer
let ciContext = CIContext(options: nil)
if let aBuffer = pixelBufferNew {
    ciContext.render(outputImage!, to: aBuffer) // >>> IT EATS A LOT OF <<< CPU
}

// convert new CVPixelBuffer to new CMSampleBuffer
var sampleTime = CMSampleTimingInfo()
sampleTime.duration = CMSampleBufferGetDuration(sampleBuffer)
sampleTime.presentationTimeStamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
sampleTime.decodeTimeStamp = CMSampleBufferGetDecodeTimeStamp(sampleBuffer)
var videoInfo: CMVideoFormatDescription? = nil
CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, pixelBufferNew!, &videoInfo)
var oBuf: CMSampleBuffer?
CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBufferNew!, true, nil, nil, videoInfo!, &sampleTime, &oBuf)

/*
try to append new CMSampleBuffer into a file (.mp4) using 
AVAssetWriter & AVAssetWriterInput... (I met errors with it, original buffer works ok 
- "from func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)")
*/*

有没有更好的解决方案?


问题答案:

现在我回答我自己的问题

最好是使用Objective-C++类(.mm),我们可以使用OpenCV的和容易/快速转换CMSampleBuffercv::Mat和回CMSampleBuffer处理后

我们可以轻松地从Swift调用Objective-C ++函数



 类似资料:
  • 问题内容: 背景 我有很多字段,这些字段将通过外部进程实时更新。我想定期更新Flask托管页面,以向连接的用户显示任何更改。理想情况下,整个页面不会刷新,这是对类似系统的抱怨,而只是更新页面上的许多字段。 当前方向 我目前的想法是使用可能的JavaScript来处理此问题,但是我不确定使用Flask时是否甚至可以实现。 Flask或第3方模块是否可以实现此目的? 其他信息 数据将使用各种套接字和串

  • 问题内容: 我看过这样的例子: 并假设我可以有一个Constants类来包装常量,并声明它们为static final。我几乎不了解Java,并且想知道这是否是创建常量的最佳方法。 问题答案: 这是完全可以接受的,甚至可能是标准。 类型是哪里,是所有大写字母的名称,下划线带有空格,并且VALUE是常量值; 我强烈建议不要将常量放在自己的类或接口中。 附带说明:声明为final且可变的变量仍然可以更

  • 问题内容: 复制列表的最佳方法是什么?我知道以下方法,哪种更好?还是有另一种方法? 问题答案: 如果要浅拷贝(不复制元素),请使用: 如果要进行深层复制,请使用复制模块:

  • 问题内容: 我有一个本质上相当于嵌套字典的数据结构。假设它看起来像这样: 现在,维护和创建它非常痛苦。每当我有一个新的州/县/专业时,我都必须通过讨厌的块创建较低层的字典。此外,如果要遍历所有值,则必须创建烦人的嵌套迭代器。 我也可以使用元组作为键,例如: 这使得对值的迭代非常简单自然,但是在语法上进行诸如汇总和查看字典子集之类的操作在语法上更加痛苦(例如,如果我只是想逐个查看状态的话)。 基本上

  • 问题内容: 我正在构建一个基于expressjs的应用程序,我想在其中记录所有事件。我可以找到温斯顿,这似乎很酷。无论如何,我正在寻找一种方法将其连接到我的expressjs应用程序。 我还想要在应用程序内部登录。我的要求不是那么简单,所以我想将所有内容记录在我的应用程序中(不仅是请求)。 我目前的情况: server.js (我想在此级别记录http请求) 路线/something.js con

  • 我有什么可用的选择来使用GWT来实现这一点?