使用GPUImageMovieWriter记录OpenGL视图

时间:2013-01-31 11:41:07

标签: ios opengl-es gpuimage

我正在尝试创建一个用我的应用程序录制的OpenGL视图。

我正在尝试使用GPUImageMovieWriter和GPUImageUIElement记录视图

因此:

 self.imageUIElement = [[GPUImageUIElement alloc]initWithView:self.myView];

NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]); // If a file already exists, AVAssetWriter won't let you record new frames, so delete the old movie
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];

__weak UIViewController * controller = self;

movieWriter.completionBlock = ^{

    MPMoviePlayerViewController * _controller = [[MPMoviePlayerViewController alloc]initWithContentURL:movieURL];

    [controller presentMoviePlayerViewControllerAnimated:_controller];


};

[self.imageUIElement addTarget:movieWriter];

我有两个按钮用于停止开始录制 当我停止记录时,我收到以下错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[AVAssetWriterInput markAsFinished] Cannot call method when status is 0'

我的观点是OpenGL 1.x

1 个答案:

答案 0 :(得分:2)

您无法使用带有GPUImageUIElement的OpenGL ES内容捕获视图。此类使用CALayer的-renderInContext:方法捕获图层(或UIView)的内容,但该方法不适用于用于OpenGL ES的CAEAGLLayers。

相反,您需要首先将OpenGL ES视图渲染到纹理,然后将该纹理传递到GPUImageTextureInput。您需要确保您的OpenGL ES上下文和GPUImage上下文位于同一个共享组中。我在CubeExample示例应用程序中展示了如何执行此操作的示例。 GPUImage使用OpenGL ES 2.0上下文,但我相信你可以通过共享组使用来自1.1上下文的纹理。

然后,您将此GPUImageTextureInput提供给您的GPUImageMovieWriter。确保为OpenGL ES场景的每个渲染帧提供适当的时间戳,否则电影录制将无法正常工作。