只是为了测试我们尝试使用具有以下功能的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 回答
您应该检查
UIImage
构造函数的文档和数据 . 我很确定你不能简单地用原始像素数据构建它,这看起来像你在做 . 这个构造函数可能需要png或jpeg数据 . 与UIImage
实例上的pngData()
方法相反 . 要从原始数据构造图像,您可以使用更低的API . This看起来很有希望,但你需要从目标C将它移植到Swift或找到类似的解决方案 .您将看到只有原始数据(如宽度,高度和像素格式)旁边需要多个参数 . 图像数据并不那么简单 . 因此,要重建它,您还需要附加此数据 . 而且由于你想将它发送到另一台设备,这可能并不那么容易 .
也许首先将它转换为JSON是最好的 . 只需使用base 64编码的字符串转换为字符串和数据:
所以现在你可以构建一个字典,如:
然后创建JSON数据
另一方面,一旦收到JSON数据,您需要将其转换回字典
并获得 Value
我希望这可以解决您的问题,但事实上您可能实际上需要的数据不仅仅是宽度和高度 .
好吧,我发现它有点粗糙 .
我创建了数据
并流式传输此数据并将其转换为UIImage
但要做到这一点,我首先将CMSampleBuffer转换为UIImage .