首页 文章

将CMSampleBuffer转换为数据和数据到UIImage不起作用,为什么

提问于
浏览
0

只是为了测试我们尝试使用具有以下功能的Swift 4将CMSampleBuffer从捕获输出转换为数据 .

在我们获取数据后,我们将此帧数据转换为UIImage并返回nil . 我们无法获得UIImage .

我们正在进行此测试,因为我们要将数据发送到其他设备以最终获得图像 .

但我们无法从数据中获取同一设备上的图像 .

我们错过了什么 .

PS:我们将此测试的FPS降低到1 .

func captureOutput(_ output: AVCaptureOutput,
                   didOutput sampleBuffer: CMSampleBuffer,
                   from connection: AVCaptureConnection) {

   func frameData() -> (Data) {

        let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

        CVPixelBufferLockBaseAddress(imageBuffer!, CVPixelBufferLockFlags(rawValue: 0))

        let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer!)
        let height = CVPixelBufferGetHeight(imageBuffer!)
        let src_buff = CVPixelBufferGetBaseAddress(imageBuffer!)

        let data = Data(bytes: src_buff!, count: bytesPerRow * height)


        CVPixelBufferUnlockBaseAddress(imageBuffer!, CVPixelBufferLockFlags(rawValue: 0))


            return (data)

    }

       DispatchQueue.main.async {
         let data = frameData()
         guard let image = UIImage(data) else {return}
         self.myImageView.image = image
     }



 }

2 回答

  • 0

    您应该检查 UIImage 构造函数的文档和数据 . 我很确定你不能简单地用原始像素数据构建它,这看起来像你在做 . 这个构造函数可能需要png或jpeg数据 . 与 UIImage 实例上的 pngData() 方法相反 . 要从原始数据构造图像,您可以使用更低的API . This看起来很有希望,但你需要从目标C将它移植到Swift或找到类似的解决方案 .

    您将看到只有原始数据(如宽度,高度和像素格式)旁边需要多个参数 . 图像数据并不那么简单 . 因此,要重建它,您还需要附加此数据 . 而且由于你想将它发送到另一台设备,这可能并不那么容易 .

    也许首先将它转换为JSON是最好的 . 只需使用base 64编码的字符串转换为字符串和数据:

    let dataInstance = Data(base64Encoded: stringInstance)
    let stringInstance = dataInstance.base64EncodedString()
    

    所以现在你可以构建一个字典,如:

    let imageJSONDescriptor: [String: Any] = [
        "width": imageWidth,
        "height": imageHeight,
        "rawRGBAData": stringInstance
    ]
    

    然后创建JSON数据

    let JSONData = try! JSONSerialization.data(withJSONObject: imageJSONDescriptor, options: .prettyPrinted
    

    另一方面,一旦收到JSON数据,您需要将其转换回字典

    imageJSONDescriptor = (try! JSONSerialization.jsonObject(with: JSONData, options: .allowFragments)) as! [String: Any]
    

    并获得 Value

    let imageWidth = imageJSONDescriptor["width"] as! Int
    let imageHeight = imageJSONDescriptor["height"] as! Int
    stringInstance = imageJSONDescriptor["rawRGBAData"] as! String
    

    我希望这可以解决您的问题,但事实上您可能实际上需要的数据不仅仅是宽度和高度 .

  • 0

    好吧,我发现它有点粗糙 .

    我创建了数据

    let data = testImage.pngData() as Data?
    

    并流式传输此数据并将其转换为UIImage

    let image = UIImage(data:Data)
    

    但要做到这一点,我首先将CMSampleBuffer转换为UIImage .

相关问题