- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 GPUImage 库函数来操作 CVPixelbuffer 的高度和宽度。我正在录制纵向视频,当用户旋转设备时,我的屏幕会自动调整为横向模式。我希望横向框架适合屏幕。
例如:- 我以 320x568 的纵向模式开始播放视频,当我将设备转为横向模式时,我的帧为 568x320,我希望它适合 320x568。为了调整这个东西,我想操纵 CVPixelBuffer。但这占用了大量内存,最后我的应用程序崩溃了。
- (CVPixelBufferRef) GPUImageCreateResizedSampleBufferWithBuffer:(CVPixelBufferRef)cameraFrame withBuffer:(CGSize)finalSize withSampleBuffer:(CMSampleBufferRef)sampleBuffer
{
CVPixelBufferRef pixel_buffer = NULL;
// CVPixelBufferCreateWithPlanarBytes for YUV input
@autoreleasepool {
CGSize originalSize = CGSizeMake(CVPixelBufferGetWidth(cameraFrame), CVPixelBufferGetHeight(cameraFrame));
CVPixelBufferLockBaseAddress(cameraFrame, 0);
GLubyte *sourceImageBytes = (GLubyte *)CVPixelBufferGetBaseAddress(cameraFrame);
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, sourceImageBytes, CVPixelBufferGetBytesPerRow(cameraFrame) * originalSize.height, NULL);
CGColorSpaceRef genericRGBColorspace = CGColorSpaceCreateDeviceRGB();
CGImageRef cgImageFromBytes = CGImageCreate((int)originalSize.width, (int)originalSize.height, 8, 32, CVPixelBufferGetBytesPerRow(cameraFrame), genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst, dataProvider, NULL, NO, kCGRenderingIntentDefault);
GLubyte *imageData = (GLubyte *) calloc(1, ((int)finalSize.width * (int)finalSize.height * 4));
CGContextRef imageContext = CGBitmapContextCreate(imageData, (int)finalSize.width, (int)finalSize.height, 8, (int)finalSize.width * 4, genericRGBColorspace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGRect scaledRect = AVMakeRectWithAspectRatioInsideRect(originalSize, CGRectMake(0, 0, finalSize.width, finalSize.height));
CGContextDrawImage(imageContext, scaledRect, cgImageFromBytes);
CGImageRelease(cgImageFromBytes);
CGContextRelease(imageContext);
CGColorSpaceRelease(genericRGBColorspace);
CGDataProviderRelease(dataProvider);
CVPixelBufferCreateWithBytes(kCFAllocatorDefault, finalSize.width, finalSize.height, kCVPixelFormatType_32BGRA, imageData, finalSize.width * 4, stillImageDataReleaseCallback, NULL, NULL, &pixel_buffer);
CMVideoFormatDescriptionRef videoInfo = NULL;
CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixel_buffer, &videoInfo);
CMTime frameTime = CMTimeMake(1, 30);
CMSampleTimingInfo timing = {frameTime, frameTime, kCMTimeInvalid};
CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixel_buffer, YES, NULL, NULL, videoInfo, &timing, &sampleBuffer);
CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
CFRelease(videoInfo);
// CVPixelBufferRelease(pixel_buffer);
}
return pixel_buffer;
}
最佳答案
CG* - CoreGraphics 使用 CPU,对于实时视频来说太慢,请使用 CV* 和 GPU
// - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
CVPixelBufferLockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);
CIImage *baseImg = [CIImage imageWithCVPixelBuffer:pixelBuffer];
CIImage *resultImg = [baseImg imageByCroppingToRect:outputFrameCropRect];
resultImg = [resultImg imageByApplyingTransform:outputFrameTransform];
// created once
// glCtx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
// ciContext = [CIContext contextWithEAGLContext:glCtx options:@{kCIContextWorkingColorSpace:[NSNull null]}];
// ciContextColorSpace = CGColorSpaceCreateDeviceRGB();
// CVReturn res = CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, VTCompressionSessionGetPixelBufferPool(compressionSession), &finishPixelBuffer);
[ciContext render:resultImg toCVPixelBuffer:finishPixelBuffer bounds:resultImg.extent colorSpace:ciContextColorSpace];
CVPixelBufferUnlockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);
关于ios - 操纵 CVPixelBufferRef 的高度和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41424549/
我想从图像创建视频。 所以,我是引用链接的来源。 链接:CVPixelBufferPool Error ( kCVReturnInvalidArgument/-6661) func writeAnim
如何将 CVPixelBufferRef 转换为 NSImage 或 CGImageRef?我需要能够在核心动画层中显示像素缓冲区的内容。 最佳答案 要将缓冲区转换为图像,您需要首先将缓冲区转换为 C
我正在使用 GPUImage 库函数来操作 CVPixelbuffer 的高度和宽度。我正在录制纵向视频,当用户旋转设备时,我的屏幕会自动调整为横向模式。我希望横向框架适合屏幕。 例如:- 我以 32
我使用的 API 只提供纹理对象的整数 ID,我需要将该纹理的数据传递给 AVAssetWriter 以创建视频。 我知道如何从像素缓冲区 (CVPixelBufferRef) 创建 CVOpenGL
我正在做一个项目,在这个项目中我从 UIImage 生成一个视频,代码是我在这里找到的,我现在正在努力优化它几天(对于大约 300 张图像,它需要大约 5 分钟模拟器,并且由于内存而在设备上崩溃)。
我正在使用 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 录制视频和音频,并在 captureOutput:didOutputSampleBu
我正在使用 AVComposition 编写一些视频处理代码。仅提供必要的背景详细信息,我从我无法控制的苹果 API 收到一个 CVPixelBuffer。这个 CVPixel 缓冲区包含一个先前渲染
我正在尝试根据用户的输入裁剪和缩放 CMSampleBufferRef,在 ratio 上,下面的代码采用 CMSampleBufferRef,将其转换为 CVImageBufferRef 并使用 C
我正在使用 glReadPixels 将数据读入 CVPixelBufferRef。我使用 CVPixelBufferRef 作为 AVAssetWriter 的输入。不幸的是,像素格式似乎不匹配。
我是 iOS 编程和多媒体的新手,我正在研究一个名为 RosyWriter 的示例项目,该项目由 apple 在 this link 提供。 .在这里,我看到在代码中有一个名为 captureOutp
我正在我的 iOS 应用程序中录制实时视频。在另一个 Stack Overflow page ,我发现您可以使用 vImage_Buffer 处理我的帧。 问题是我不知道如何从输出的 vImage_b
我们曾经像下面这样初始化 CVPixelBufferRef。 CVPixelBufferRef pxbuffer = NULL; 但是在 Swift 中我们不能使用 NULL,所以我们尝试了下面的
在 objective-c 中,您可以轻松地将 CVImageBufferRef 转换为 CVPixelBufferRef: CMSampleBufferRef sampleBuffer = some
我想将 UIImage 对象转换为 CVPixelBufferRef 对象,但我完全不知道。而且我找不到执行此类操作的任何示例代码。 有人可以帮帮我吗?提前致谢! 你好 最佳答案 有不同的方法可以做到
我正在使用 BlackMagic DeckLink SDK 尝试从 BM 设备捕获帧。 我正在尝试从 DeckLinkController::VideoInputFrameArrived 回调中的 I
尝试在 SCNRender 对象的每次调用渲染上从 MTLTexture 创建 CVPixelBufferRef: CVPixelBufferLockBaseAddress(pixelBuffer
我需要创建一个 CVPixelBufferRef 的副本,以便能够使用副本中的值以按位方式操作原始像素缓冲区。我似乎无法使用 CVPixelBufferCreate 或 CVPixelBufferCr
如何从 CVPixelBufferRef 获取 RGB(或任何其他格式)像素值?我尝试了很多方法,但都没有成功。 func captureOutput(captureOutput: AVCapture
我正在使用 AVCaptureSession 和 AVCapturePhotoOutput 以 kCVPixelFormatType_14Bayer_RGGB 格式从设备相机捕获 RAW 照片数据。
我正在编写自定义电影录制应用程序,并实现了 AVAssetWriter 和 AVAssetWriterInputPixelBufferAdaptor 以将帧写入文件。在 DataOutputDeleg
我是一名优秀的程序员,十分优秀!