我正在使用GPUImageTextureInput和GPUImageMovieWriter,
但我总是有一段黑色视频。
我错过了什么吗?我花了几天时间。frameBuffer和纹理设置在这里:
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[[[GPUImageContext sharedImageProcessingContext] context] sharegroup]];
[EAGLContext setCurrentContext:self.context];
GLenum status;
glGenFramebuffers(1, &newFrameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, newFrameBuffer);
glGenTextures(1, &outputTexture);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 640, 1136 , 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, 0);
和电影作家:
textureInput = [[GPUImageTextureInput alloc] initWithTexture:outputTexture size:size];
NSURL *movieURL = [NSURL fileURLWithPath:
[NSString stringWithFormat:@"%@%f.mp4", NSTemporaryDirectory(),
[[NSDate date] timeIntervalSince1970]]];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(640, 1136)];
movieWriter.encodingLiveVideo = YES;
[textureInput addTarget:movieWriter];
double delayToStartRecording = 1.0;
dispatch_time_t sstartTime = dispatch_time(DISPATCH_TIME_NOW, delayToStartRecording * NSEC_PER_SEC);
dispatch_after(sstartTime, dispatch_get_main_queue(), ^(void){
NSLog(@"Start recording");
//videoCamera.audioEncodingTarget = movieWriter;
[movieWriter startRecording];
started = YES;
// NSError *error = nil;
// if (![videoCamera.inputCamera lockForConfiguration:&error])
// {
// NSLog(@"Error locking for configuration: %@", error);
// }
// [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn];
// [videoCamera.inputCamera unlockForConfiguration];
double delayInSeconds = 20.0;
dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){
[movieWriter finishRecordingWithCompletionHandler:^{
NSLog(@"Movie completed");
finished = YES;
}];
// [videoCamera.inputCamera lockForConfiguration:nil];
// [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOff];
// [videoCamera.inputCamera unlockForConfiguration];
});
});
和drawInRect
[(GLKView*)self.view bindDrawable];
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArrayOES(_vertexArray);
// Render the object with GLKit
[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, 36);
// Render the object again with ES2
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawArrays(GL_TRIANGLES, 0, 36);
glFlush();
//[EAGLContext setCurrentContext:self.context];
glBindFramebuffer(GL_FRAMEBUFFER, newFrameBuffer);
glViewport(0,0, 640,1138);
glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArrayOES(_vertexArray);
// Render the object with GLKit
[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, 36);
// Render the object again with ES2
glUseProgram(_program);
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m);
glDrawArrays(GL_TRIANGLES, 0, 36);
glFlush();
// some GPUImage code
答案 0 :(得分:0)
我的帧缓冲输出/输出纹理也是黑色的。我尝试了很多东西,几天开关调试,主要是关注Brad Larson的CubeExample。
一旦我添加了这个电话,事情就开始出现了:
glBindTexture(GL_TEXTURE_2D, 0)
呼叫glTexImage2D
和glFramebufferTexture2D
这是该示例项目供参考。 https://github.com/BradLarson/GPUImage/tree/master/examples/iOS/CubeExample