如何使用GPUImage框架保存电影?

时间:2014-02-17 09:48:42

标签: ios gpuimage

我正在尝试通过在GPUImageMovie和GPUImageMovieWriter之间添加过滤器来处理视频。但是,在添加自定义过滤器之前,我遇到了麻烦。

这是我的测试代码。

    NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"Documents/test" withExtension:@"mov"];
    movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];

    NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/output.mov"];
    unlink([pathToMovie UTF8String]);
    NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];

    movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1280.0, 720.0)];

    [movieFile addTarget:movieWriter];

    [movieWriter startRecording];
    [movieFile startProcessing];

    [movieWriter setCompletionBlock:^{
        [movieFile removeTarget:movieWriter];
        [movieWriter finishRecording];
    }];

我收到了这样的错误消息

uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVAssetReader initWithAsset:error:] invalid parameter not satisfying: asset != ((void*)0)'

,并且在Documents文件夹下创建了一个名为output.mov的文件,其大小为0。

我该怎么做才能解决这个简单的任务?

2 个答案:

答案 0 :(得分:1)

您的问题似乎在这里:

[pixellateFilter addTarget:movieWriter];

[movieFile addTarget:movieWriter];

您要将过滤器和电影源都添加到电影编辑器中。我想你的意思是:

[movieFile addTarget:pixellateFilter];
[pixellateFilter addTarget:movieWriter];

答案 1 :(得分:1)

此错误表示未找到样本文件或其大小为零。

我相信您正在将捆绑文件与沙盒文件混合在一起。你的test.mov文件在哪里?如果它在捆绑中(即添加到项目文件中),那么您应该使用:

NSURL *sampleURL = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"mov"];

即使它位于名为Documents的文件夹下。 但如果它位于应用程序的沙箱文件中,那么您应该使用:

NSString *pathToSample = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test.mov"];
NSURL *sampleURL = [NSURL fileURLWithPath:pathToSample];