2014-04-27 4 views
1

나는 CPU에서 처리 할 CVPixelBufferRef 객체를 1 개 (또는 2 개) 가질 수 있으며 결과를 최종 CVPixelBufferRef에 배치합니다. CPU가 간신히 유지할 수 있기 때문에 대신 GLSL을 사용하여 GPU에서이 처리를하고 싶습니다 (라이브 비디오 프레임 임). 나는 이것이 가능한 "직접"(즉, 내 자신의 오픈 gl 코드를 작성하는 것) 가능하다는 것을 알고 있지만 (절대적으로 침투 할 수없는) 샘플 코드에서 보았을 때 그것은 미친 양의 일이었다.GPP 텍스처로 CVPixelBufferRef

1) GPUImage가 :

두 가지 옵션을 것 같다 이것은 멋진 라이브러리입니다,하지만 난 쉽게 원하는 것을 할 수 있다면 좀 불분명 해요. 다음과 같이 GPUImageRawDataInput에 CVPixelBufferRef에서

@{ (NSString *)kCVPixelBufferPixelFormatTypeKey : [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], 
      (NSString*)kCVPixelBufferOpenGLESCompatibilityKey : [NSNumber numberWithBool:YES]}; 

그런 다음 데이터 전송 :이 코드를 사용하여 OpenGLES에게 호환 픽셀 버퍼를 요청했다 시도 우선

// setup: 
_foreground = [[GPUImageRawDataInput alloc] initWithBytes:nil size:CGSizeMake(0,0)pixelFormat:GPUPixelFormatBGRA type:GPUPixelTypeUByte]; 

// call for each frame: 
[_foreground updateDataFromBytes:CVPixelBufferGetBaseAddress(foregroundPixelBuffer) 
          size:CGSizeMake(CVPixelBufferGetWidth(foregroundPixelBuffer), CVPixelBufferGetHeight(foregroundPixelBuffer))]; 

을하지만, 내 CPU 사용률이 27에 7 %에서 간다 그 라인 (아무 처리도 또는 아무것도)과 아이폰 5S 그냥 %. 이것은 CPU에 어떤 복사 작업이 진행 중이거나 다른 작업이 잘못되었다는 것을 의미합니다. 내가 놓친 게 있니?

2) OpenFrameworks : OF는 일반적으로 이러한 유형의 작업에 사용되며 OF 프로젝트는 GLSL을 사용하도록 쉽게 설정할 수 있습니다. 그러나이 솔루션에 대한 두 가지 질문이 남아 있습니다. 1. Openframeworks를 라이브러리로 사용할 수 있습니까? 아니면 OpenGL 기능을 사용하기 위해 전체 앱을 다시 잡아야합니까? 실제로 처음부터 시작하지 않고 OF 응용 프로그램을 만들지 않고이를 수행 할 수있는 방법을 보여주는 자습서 나 문서는 표시되지 않습니다. 2. CVPixelBufferRef를 텍스처로 사용할 수 있습니까?

iOS 7 이상을 타겟팅하고 있습니다.

답변

0

GPUImageMovie 클래스를 사용하여이 기능을 사용할 수있었습니다. 이 클래스 내부에 보면라는 private method이 있다고 볼 수 있습니다 :

- (void)processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime 

이 방법은 입력으로 CVPixelBufferRef 걸립니다.

GPUImageMovie *gpuMovie = [[GPUImageMovie alloc] initWithAsset:nil];  // <- call initWithAsset even though there's no asset 
                      // to initialize internal data structures 

// connect filters... 

// Call the method we exposed 
[gpuMovie processMovieFrame:myCVPixelBufferRef withSampleTime:kCMTimeZero]; 

:

@interface GPUImageMovie() 
-(void) processMovieFrame:(CVPixelBufferRef)movieFrame withSampleTime:(CMTime)currentSampleTime; 
@end 

그런 다음 클래스는 필터를 설정 초기화, 그리고 당신의 비디오 프레임을 통과,이 방법에 액세스 클래스 내부를 노출하는 클래스 확장을 선언하려면 한 가지 : library expects과 일치 시키려면 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange으로 픽셀 버퍼를 요청해야합니다.

+0

나는이 질문을 1 년 전에 게시 했으므로 세부 사항을 기억하지 않습니다. 나는 당신이 일하기를 얻은 것처럼 보이기 때문에 앞으로 나아가고 당신의 답을 옳은 것으로 표시 할 것입니다! –