현재 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];
난 후 특정 시간에 초기의 비디오 프레임에 대응하는 CVImageBufferRef
를 AVPlayerItemVideoOutput
에서 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
파일에서 가져올 수 있지만이 파일에 이상이 있는지 확인하려면 어떻게해야합니까?
많은 도움을 주셔서 감사합니다. 몇 시간 동안이 문제에 정말 고생했습니다.
가장 좋은 방법은 픽셀 버퍼가 텍스처에서 예상 한대로 RGBA 데이터로 구성되지 않는 것입니다. 버퍼에서 형식을 가져 오거나 최소한 버퍼의 행당 바이트 수를 확인하고 체크 아웃 여부를 확인하십시오 (4 * 너비). 그것은 비디오에서 왔기 때문에 RGB 데이터 일 뿐이므로 이미지가 슬라이스됩니다. 슬라이스 된 이미지로 인한 또 다른 문제는 버퍼 데이터가 축을 뒤집어서 표시 될 수 있으므로 너비와 높이가 뒤집 힙니다.이 경우 데이터를 텍스처로 보낼 때 너비와 높이 인수를 대칭 이동해야합니다. –
안녕하세요, 행 당 바이트 수를 확인했는데 CVPixelBufferGetBytesPerRow (imageBuffer) 함수에서 4 * bufferWidth와 1472를 계산하여 1440을 얻었습니다. 그것은 내가 사용한 RGBA 형식이 비디오의 올바른 형식이 아니라는 것을 의미합니까? 내가 CVPixelBufferGetPixelFormatType을 사용하여 픽셀 형식을 확인할 수 있지만 나는 무엇을해야할지 모르겠다. – sangohan42
나는 실수했다. 나는 너의 말이 맞았다. Matic Oblak, 실수를해서 미안하다. – sangohan42