Skip to content

Instantly share code, notes, and snippets.

@levantAJ
Last active October 12, 2022 03:02
Show Gist options
  • Save levantAJ/4e3e40ba2fa190fd88e329ede8f27f3f to your computer and use it in GitHub Desktop.
Save levantAJ/4e3e40ba2fa190fd88e329ede8f27f3f to your computer and use it in GitHub Desktop.
Create CMSampleBuffer from UIImage
import ImageIO
import AVFoundation
var cvPixelBuffer: CVPixelBuffer? {
var pixelBuffer: CVPixelBuffer? = nil
let options: [NSObject: Any] = [
kCVPixelBufferCGImageCompatibilityKey: false,
kCVPixelBufferCGBitmapContextCompatibilityKey: false,
]
let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(size.width), Int(size.height), kCVPixelFormatType_32BGRA, options as CFDictionary, &pixelBuffer)
CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer!)
let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(data: pixelData, width: Int(size.width), height: Int(size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer!), space: rgbColorSpace, bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue)
context?.draw(cgImage!, in: CGRect(origin: .zero, size: size))
CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
return pixelBuffer
}
var cmSampleBuffer: CMSampleBuffer {
let pixelBuffer = cvPixelBuffer
var newSampleBuffer: CMSampleBuffer? = nil
var timimgInfo: CMSampleTimingInfo = kCMTimingInfoInvalid
var videoInfo: CMVideoFormatDescription? = nil
CMVideoFormatDescriptionCreateForImageBuffer(nil, pixelBuffer!, &videoInfo)
CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer!, true, nil, nil, videoInfo!, &timimgInfo, &newSampleBuffer)
return newSampleBuffer!
}
@yo113
Copy link

yo113 commented Jun 11, 2021

Hello levantAJ is there any way to convert CMSampleBufffer to Data(). As i am creating application which having video recording and I got this sample buffer for video recording. And I want to send this video buffer data to server. So I need to convert this buffer to data.

Thanks in advance

@SolskGaer
Copy link

I got this error using your code, and I used CGImage instead of UIImage

CGBitmapContextCreate: unsupported parameter combination:
 	8 bits/component; integer;
 	24 bits/pixel;
	RGB color space model; kCGImageAlphaNone;
	kCGImageByteOrder32Little byte order;
	3008 bytes/row.
Valid parameters for RGB color space model are:
	16  bits per pixel,		 5  bits per component,		 kCGImageAlphaNoneSkipFirst
	32  bits per pixel,		 8  bits per component,		 kCGImageAlphaNoneSkipFirst
	32  bits per pixel,		 8  bits per component,		 kCGImageAlphaNoneSkipLast
	32  bits per pixel,		 8  bits per component,		 kCGImageAlphaPremultipliedFirst
	32  bits per pixel,		 8  bits per component,		 kCGImageAlphaPremultipliedLast
	32  bits per pixel,		 10 bits per component,		 kCGImageAlphaNone|kCGImagePixelFormatRGBCIF10
	64  bits per pixel,		 16 bits per component,		 kCGImageAlphaPremultipliedLast
	64  bits per pixel,		 16 bits per component,		 kCGImageAlphaNoneSkipLast
	64  bits per pixel,		 16 bits per component,		 kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents|kCGImageByteOrder16Little
	64  bits per pixel,		 16 bits per component,		 kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents|kCGImageByteOrder16Little
	128 bits per pixel,		 32 bits per component,		 kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
	128 bits per pixel,		 32 bits per component,		 kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents
 See Quartz 2D Programming Guide (available online) for more information.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment