ios - 使用 GPUImageMovieWriter 记录 OpenGL View

标签 ios opengl-es gpuimage

我正在尝试创建一个将使用我的应用程序进行记录的 OpenGL View 。

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

因此:

 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'

我的 View 是 OpenGL 1.x

最佳答案

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

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

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

关于ios - 使用 GPUImageMovieWriter 记录 OpenGL View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14624877/

相关文章:

android - 如何从其他文件 Dart 调用 setState

iphone - 矩阵堆栈容量在 Android NDK 中有点小

ios - GPUImageLookupFilter 不工作

android - meteor 热码推送的Layout/Template

ios - 从 Appdelegate 实例化 View Controller

ios - iOS 中这个可关闭的 viewcontrollable 的名称是什么?

ios - GPUImage:掩模模糊

android - 是否保证 OpenGLES2.0 android 设备支持模板缓冲区?

mobile - OpenGL 与 PhoneGap

ios - GPUImage 在 iOS 上未通过 CVPixelBufferGetPlaneCount 检查