gpt4 book ai didi

iphone - 从 iPhone 上的视频输出获取静态图像?

转载 作者:行者123 更新时间:2023-12-03 20:30:58 27 4
gpt4 key购买 nike

我正在编写一个应用程序来显示 iPhone 相机所看到的光照条件的统计数据。我每秒拍摄一张图像,并对其进行计算。

为了捕获图像,我使用以下方法:

-(void) captureNow
{
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in captureManager.stillImageOutput.connections)
{
for (AVCaptureInputPort *port in [connection inputPorts])
{
if ([[port mediaType] isEqual:AVMediaTypeVideo] )
{
videoConnection = connection;
break;
}
}
if (videoConnection) { break; }
}

[captureManager.stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
{
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
latestImage = [[UIImage alloc] initWithData:imageData];
}];
}

但是,captureStillImageAsynhronously....方法会导致手机播放“快门”声音,这对我的应用程序不利,因为它将不断捕获图像。

我了解到无法禁用此声音效果。相反,我想从手机的视频输入中捕获帧:

AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self backFacingCamera] error:nil];

并希望将这些变成 UIImage对象。

我该如何实现这一目标?我不太了解 AVFoundation 的工作原理 - 我下载了一些示例代码并根据我的目的对其进行了修改。

最佳答案

请勿为此使用静态相机。相反,从设备的摄像机中抓取并处理作为 AVCaptureVideoDataOutputSampleBufferDelegate 响应而获得的像素缓冲区中包含的数据。

您可以使用如下代码设置视频连接:

// Grab the back-facing camera
AVCaptureDevice *backFacingCamera = nil;
NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *device in devices)
{
if ([device position] == AVCaptureDevicePositionBack)
{
backFacingCamera = device;
}
}

// Create the capture session
captureSession = [[AVCaptureSession alloc] init];

// Add the video input
NSError *error = nil;
videoInput = [[[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error] autorelease];
if ([captureSession canAddInput:videoInput])
{
[captureSession addInput:videoInput];
}

// Add the video frame output
videoOutput = [[AVCaptureVideoDataOutput alloc] init];
[videoOutput setAlwaysDiscardsLateVideoFrames:YES];
[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];

[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];

if ([captureSession canAddOutput:videoOutput])
{
[captureSession addOutput:videoOutput];
}
else
{
NSLog(@"Couldn't add video output");
}

// Start capturing
[captureSession setSessionPreset:AVCaptureSessionPreset640x480];
if (![captureSession isRunning])
{
[captureSession startRunning];
};

然后,您需要在委托(delegate)方法中处理这些帧,如下所示:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(cameraFrame, 0);
int bufferHeight = CVPixelBufferGetHeight(cameraFrame);
int bufferWidth = CVPixelBufferGetWidth(cameraFrame);

// Process pixel buffer bytes here

CVPixelBufferUnlockBaseAddress(cameraFrame, 0);
}

BGRA 图像的原始像素字节将包含在从 CVPixelBufferGetBaseAddress(cameraFrame) 开始的数组中。您可以迭代这些值以获得所需的值。

但是,您会发现在 CPU 上对整个图像执行的任何操作都会有点慢。您可以使用加速来帮助进行平均颜色操作,就像您在这里想要的那样。我过去曾使用 vDSP_meanv() 来平均亮度值(一旦您将这些值放入数组中)。对于类似的情况,您可能最好从相机中获取 YUV 平面数据,而不是我在此处下拉的 BGRA 值。

我还写过an open source framework使用 OpenGL ES 处理视频,尽管我还没有像您需要的图像分析那样进行全图像缩减操作。我的直方图生成器可能是最接近您想要做的事情的。

关于iphone - 从 iPhone 上的视频输出获取静态图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10586589/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com