2014-04-25 2 views
1

현재 iOS에서 OpenGL ES 2을 사용하여 화면에 비디오를 표시하려고합니다.OpenGL 형식 텍스처

우선은 GPUImageMovieWriter 객체를 사용하여 기록 된 .mov 파일이 있습니다

는 내가 재생 화면에서 비디오를 표시하는 일을하고 무엇을 조금 요약됩니다. 녹화가 끝나면 AVPlayer을 사용하여 비디오를 재생하려고합니다. 따라서, I 비디오에서 프레임을 검색 할 수있게하는 AVPlayerItemVideoOutput을 설정

NSDictionary *test = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey: (id)kCVPixelBufferPixelFormatTypeKey]; 
     self.videoOutput = [[AVPlayerItemVideoOutput alloc] initWithPixelBufferAttributes:test]; 

난 후 특정 시간에 초기의 비디오 프레임에 대응하는 CVImageBufferRefAVPlayerItemVideoOutput에서 copyPixelBufferForItemTime 함수를 사용하여 수신한다.

- (void)setupTextureFromBuffer:(CVImageBufferRef)imageBuffer { 

    CVPixelBufferLockBaseAddress(imageBuffer, 0); 

    int bufferHeight = CVPixelBufferGetHeight(imageBuffer); 
    int bufferWidth = CVPixelBufferGetWidth(imageBuffer); 

    CVPixelBufferGetPixelFormatType(imageBuffer); 
    glBindTexture(GL_TEXTURE_2D, m_videoTexture); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bufferWidth, bufferHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, CVPixelBufferGetBaseAddress(imageBuffer)); 

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0); 
} 

(일부 증강 현실 일을하는 일부 비 관련 알고리즘을 사용하여도하고) 이렇게함으로써 나는 매우 가지고 :

마지막으로, 여기에 내가 버퍼에서 OpenGL 텍스처를 생성하기 위해 만든 기능입니다 비디오가 슬라이스에 넣어 진 것처럼 이상한 결과가 나타납니다 (그렇게하기에 충분한 평판이 없기 때문에 내가 보여줄 수는 없습니다).

그것은 데이터가 잘 OpenGL에 의해 해석되지 않는 것 같습니다

나는이 기능을 사용하여 손상된 버퍼 오류가 될 수 있는지 확인 (형식이 잘못 입력?) :

- (void)saveImage:(CVPixelBufferRef)pixBuffer 
{ 
    CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixBuffer]; 

    CIContext *temporaryContext = [CIContext contextWithOptions:nil]; 
    CGImageRef videoImage = [temporaryContext 
          createCGImage:ciImage 
          fromRect:CGRectMake(0, 0, 
               CVPixelBufferGetWidth(pixBuffer), 
               CVPixelBufferGetHeight(pixBuffer))]; 

    UIImage *uiImage = [UIImage imageWithCGImage:videoImage]; 

    UIImageWriteToSavedPhotosAlbum(uiImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 

}  

-> 저장된 이미지가 사진 앨범에 올바르게 나타났습니다.

이 파일은 .mov 파일에서 가져올 수 있지만이 파일에 이상이 있는지 확인하려면 어떻게해야합니까?

많은 도움을 주셔서 감사합니다. 몇 시간 동안이 문제에 정말 고생했습니다.

+0

가장 좋은 방법은 픽셀 버퍼가 텍스처에서 예상 한대로 RGBA 데이터로 구성되지 않는 것입니다. 버퍼에서 형식을 가져 오거나 최소한 버퍼의 행당 바이트 수를 확인하고 체크 아웃 여부를 확인하십시오 (4 * 너비). 그것은 비디오에서 왔기 때문에 RGB 데이터 일 뿐이므로 이미지가 슬라이스됩니다. 슬라이스 된 이미지로 인한 또 다른 문제는 버퍼 데이터가 축을 뒤집어서 표시 될 수 있으므로 너비와 높이가 뒤집 힙니다.이 경우 데이터를 텍스처로 보낼 때 너비와 높이 인수를 대칭 이동해야합니다. –

+0

안녕하세요, 행 당 바이트 수를 확인했는데 CVPixelBufferGetBytesPerRow (imageBuffer) 함수에서 4 * bufferWidth와 1472를 계산하여 1440을 얻었습니다. 그것은 내가 사용한 RGBA 형식이 비디오의 올바른 형식이 아니라는 것을 의미합니까? 내가 CVPixelBufferGetPixelFormatType을 사용하여 픽셀 형식을 확인할 수 있지만 나는 무엇을해야할지 모르겠다. – sangohan42

+0

나는 실수했다. 나는 너의 말이 맞았다. Matic Oblak, 실수를해서 미안하다. – sangohan42

답변