使用 sampleBufferFromUIImage 即可
-(CMSampleBufferRef)sampleBufferFromUIImage:(UIImage *)image {
CVPixelBufferRef pb = [self CVPixelBufferFromUIImage:image];
return [self sampleBufferFromCVPixelBuffer:pb];
}
-(CMSampleBufferRef)sampleBufferFromCVPixelBuffer:(CVPixelBufferRef)pixelBuffer {
CMSampleBufferRef sbuffer = nil;
CMVideoFormatDescriptionRef descrip;
CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, &descrip);
OSStatus _status = CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, true, nil, nil,
descrip,
&kCMTimingInfoInvalid,
&sbuffer);
if (_status != noErr) {
NSLog(@"sampleBufferFromCVPixelBuffer %d", _status);
}
CVPixelBufferRelease(pixelBuffer);
return sbuffer;
}
-(CVPixelBufferRef)CVPixelBufferFromUIImage:(UIImage *)img {
CGImageRef image = [img CGImage];
CGFloat width = CGImageGetWidth(image);
CGFloat height = CGImageGetHeight(image);
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
@YES, kCVPixelBufferCGImageCompatibilityKey,
@YES, kCVPixelBufferCGBitmapContextCompatibilityKey,
nil];
CVPixelBufferRef pxbuffer = NULL;
CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, width, height,
kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef _Nullable)(options), &pxbuffer);
if (status != noErr) {
NSLog(@"CVPixelBufferFromUIImage %d", status);
}
CVPixelBufferLockBaseAddress(pxbuffer, 0);
void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pxdata, width, height, 8,
CVPixelBufferGetBytesPerRow(pxbuffer),
rgb,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
CGColorSpaceRelease(rgb);
CGContextRelease(context);
CVPixelBufferUnlockBaseAddress(pxbuffer, 0);
return pxbuffer;
}