2013-01-31 28 views
2

我正在嘗試創建一個OpenGL視圖,該視圖將使用我的應用程序進行記錄。使用GPUImageMovieWriter記錄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的

+0

你好,我面臨同樣的問題。我試過使用GPUImageTextureInput,但我的結果視頻只有1幀。如果你成功了,你可以發佈一些代碼嗎? – Xys

回答

2

您不能捕獲使用OpenGL ES內容有GPUImageUIElement的視圖。該類使用CALayer的-renderInContext:方法捕獲圖層(或UIView)的內容,但該方法不適用於用於OpenGL ES的CAEAGLLayers。

相反,您需要首先渲染OpenGL ES視圖到紋理,然後將該紋理傳遞到GPUImageTextureInput。您將需要確保您的OpenGL ES上下文和GPUImage上下文位於同一個共享組中。我將展示如何在CubeExample示例應用程序中執行此操作的示例。 GPUImage使用OpenGL ES 2.0上下文,但我相信您可以通過共享組使用1.1環境中的紋理。

然後,您可以將此GPUImageTextureInput送入您的GPUImageMovieWriter。確保爲OpenGL ES場景的每個渲染幀提供適當的時間戳,否則電影錄製將無法正常工作。

+0

要更具體一些,我想記錄一個OpenGL繪畫視圖,我想它不會改變你的建議。 – Janub

+0

我不能把兩個上下文(GLES1和GLES2)放在同一個共享組上。 – Janub

+1

@Janub - 是的,我現在看到語言「與同一個共享組關聯的所有上下文必須使用與初始上下文相同版本的OpenGL ES API」。在這種情況下,您需要將OpenGL繪畫視圖(我猜測基於GLPaint示例應用程序)移植到2.0或基於'glReadPixels()'創建自己的視頻錄像機。 –