从UIImage创建CMSampleBuffer

使用 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值