2

アプリで記録する 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];

記録を停止して開始するための2つのボタンがあり、記録を停止すると次のエラーが発生します。

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

?

私のビューは OpenGL 1.x です

4

1 に答える 1

2

GPUImageUIElement で OpenGL ES コンテンツを使用してビューをキャプチャすることはできません。このクラスは-renderInContext:CALayer のメソッドを使用してレイヤー (または UIView) のコンテンツをキャプチャしますが、そのメソッドは OpenGL ES に使用される CAEAGLLayers では機能しません。

代わりに、最初に OpenGL ES ビューをテクスチャにレンダリングしてから、そのテクスチャを GPUImageTextureInput に渡す必要があります。OpenGL ES コンテキストと GPUImage コンテキストが同じ共有グループにあることを確認する必要があります。これを行う方法の例を CubeExample サンプル アプリケーションで示します。GPUImage は OpenGL ES 2.0 コンテキストを使用しますが、共有グループを介して 1.1 コンテキストのテクスチャを使用できると思います。

次に、この GPUImageTextureInput を GPUImageMovieWriter にフィードします。OpenGL ES シーンの各レンダリング フレームに適切なタイムスタンプを指定してください。そうしないと、ムービーの記録が正しく機能しません。

于 2013-01-31T22:44:09.503 に答える