簡體   English   中英

將CMSampleBuffer轉換為數據並將數據轉換為UIImage無法正常工作,為什么

[英]Converting CMSampleBuffer to Data and Data To UIImage does not work, why

為了測試,我們嘗試使用具有以下功能的Swift 4將CMSampleBuffer從捕獲輸出轉換為Data。

獲取數據后,我們將該幀數據轉換為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
     }



 }    

您應該檢查帶有數據的UIImage構造函數的文檔。 我敢肯定,您不能僅使用原始像素數據來構建它,就像您正在做的那樣。 該構造函數可能期望png或jpeg數據。 UIImage實例上的類似pngData()方法的反向操作。 要從原始數據構造圖像,可以使用較低的API。 看起來很有希望,但是您需要將其從目標C移植到Swift或找到類似的解決方案。

您會看到,除了原始數據(例如寬度,高度和像素格式)外,還需要多個參數。 圖像數據並非如此簡單。 因此,要重建它,您還需要附加此數據。 而且由於您要將其發送到另一台設備,這可能並不容易。

也許一開始最好將其轉換為JSON。 只需使用以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]

並獲得價值

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

我希望這可以解決您的問題,但實際上您可能需要的不僅僅是寬度和高度,還需要更多數據。

好吧,我發現它有點粗糙。

我用創建數據

  let data = testImage.pngData() as Data?

並流傳輸此數據並將其轉換為UIImage

  let image = UIImage(data:Data)

但是要做到這一點,我首先將CMSampleBuffer轉換為UIImage。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM