[英]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.