iOS 카메라에서 YUV420SP 데이터 가져오기
#import
#import
클래스는 AVCaptureVideoDataOutputSampleBufferDelegate 에이전트를 준수해야 합니다.
Session 설정
- (void)setSession
{
_captureInput = [[AVCaptureDeviceInput alloc]initWithDevice:[self getFrontCameraDevice] error:nil];
AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc]
init];
captureOutput.alwaysDiscardsLateVideoFrames = YES;
dispatch_queue_t queue;
queue = dispatch_queue_create("cameraQueue", NULL);
[captureOutput setSampleBufferDelegate:self queue:queue];
NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
NSNumber* value = [NSNumber
numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange];
NSDictionary* videoSettings = [NSDictionary
dictionaryWithObject:value forKey:key];
[captureOutput setVideoSettings:videoSettings];
self.captureSession = [[AVCaptureSession alloc] init];
[self.captureSession addInput:_captureInput];
[self.captureSession addOutput:captureOutput];
[self.captureSession setSessionPreset:AVCaptureSessionPreset640x480];
}
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange];
설정 카메라가 반환되는 데이터 유형을 YUV420SP 유형으로 나타냅니다.
[self.captureSessionsetSessionPreset:AVCaptureSessionPreset640x480];
해상도 설정
/**
*
*
* @return
*/
- (AVCaptureDevice *)getFrontCameraDevice{
NSArray *cameras= [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *camera in cameras) {
if ([camera position] == AVCaptureDevicePositionFront) {
return camera;
}
}
return nil;
}
AVCaptureVideoDataOutputSampleBufferDelegate 에이전트의 작업
#pragma mark AVCaptureSession - delegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer, 0);
CMTime pts = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
CMTime duration = CMSampleBufferGetDuration(sampleBuffer);
// Get the number of bytes per row for the plane pixel buffer
void *imageAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
Byte *buf = malloc(width * height * 3/ 2);
memcpy(buf, imageAddress, width * height);
size_t a = width * height;
size_t b = width * height * 5 / 4;
for (NSInteger i = 0; i < width * height/ 2; i ++) {
memcpy(buf + a, imageAddress + width * height + i , 1);
a++;
i++;
memcpy(buf + b, imageAddress + width * height + i, 1);
b++;
}
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
}
YUV420SP의 데이터를 YUV420P로 다시 정렬
Byte *buf = malloc(width * height *3/ 2);
memcpy(buf, imageAddress, width * height);
size_t a = width * height;
size_t b = width * height * 5/4;
for (NSInteger i =0; i < width * height/2; i++) {
memcpy(buf + a, imageAddress + width * height + i ,1);
a++;
i++;
memcpy(buf + b, imageAddress + width * height + i,1);
b++;
}
buf의 데이터는 바로 YUV420P의 데이터로 OpenGL ES에 표시할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.