我正在开发一个应用程序,该应用程序使用DJI Mavic 2的视频提要并通过机器学习模型运行它来识别对象。
我设法使用此sample DJI project来让我的应用预览无人机的提要,但是尝试将视频数据转换为{{3}可以使用的格式时遇到了很多麻烦}。
我使用Vision
framework作为创建模型的指南(正在运行!),但是看来我需要创建一个VNImageRequestHandler
对象,该对象是使用{类型的cvPixelBuffer
创建的{1}}才能使用CMSampleBuffer
。
有人知道如何进行这种转换吗?有更好的方法吗?
Vision
编辑:根据我从DJI(伪造)文档中收集的信息,看来视频供稿是压缩的H264。他们声称class DJICameraViewController: UIViewController, DJIVideoFeedListener, DJISDKManagerDelegate, DJICameraDelegate, VideoFrameProcessor {
// ...
func videoFeed(_ videoFeed: DJIVideoFeed, didUpdateVideoData rawData: Data) {
let videoData = rawData as NSData
let videoBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: videoData.length)
videoData.getBytes(videoBuffer, length: videoData.length)
DJIVideoPreviewer.instance().push(videoBuffer, length: Int32(videoData.length))
}
// MARK: VideoFrameProcessor Protocol Implementation
func videoProcessorEnabled() -> Bool {
// This is never called
return true
}
func videoProcessFrame(_ frame: UnsafeMutablePointer<VideoFrameYUV>!) {
// This is never called
let pixelBuffer = frame.pointee.cv_pixelbuffer_fastupload as! CVPixelBuffer
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: exifOrientationFromDeviceOrientation(), options: [:])
do {
try imageRequestHandler.perform(self.requests)
} catch {
print(error)
}
}
} // End of DJICameraViewController class
包括用于解压缩的辅助方法,但是由于没有有关其用法的文档,我未能成功理解如何正确使用它们。
编辑2 :这是DJIWidget框架的this example from Apple
编辑3 :使用DJIWidget
的其他方法更新了代码段,从VideoFrameProcessor
方法中删除了旧代码
编辑4 :有关如何成功提取和使用像素缓冲区的详细信息,请参见issue I created on GitHub
答案 0 :(得分:3)
步骤:
调用DJIVideoPreviewer
的{{1}}方法并输入push:length:
。在rawData
内部,如果您使用过DJIVideoPreviewer
,请跳过此步骤。 (一旦执行此操作,将执行H.264解析和解码步骤。)
符合VideoPreviewerSDKAdapter
协议并调用VideoFrameProcessor
以注册DJIVideoPreviewer.registFrameProcessor
协议对象。
VideoFrameProcessor
协议的VideoFrameProcessor
方法将输出videoProcessFrame:
数据。
获取VideoFrameYUV
数据。 CVPixelBuffer
结构具有一个VideoFrameYUV
字段,当打开硬件解码时,此数据实际上是cv_pixelbuffer_fastupload
类型的数据。如果您使用软件解码,则需要自己创建CVPixelBuffer
并复制CVPixelBuffer
的{{1}},VideoFrameYUV
和luma
字段中的数据
代码:
chromaB