GPUImage 由于 [AVAssetWriter startWriting] 状态为 3 时无法调用方法而终止



我在运行 GPU 时遇到问题。我已经修改了SimpleVideoFileFilter程序(用色度键过滤器替换了过滤器(,并且正在使用我自己的视频。由于以下错误,我的程序正在终止:

[AVAssetWriter startWriting] 当状态为 3' 时无法调用方法

我已经浏览了论坛,但不确定为什么电影作者要关闭,然后有人写信给它。

我正在使用运行iOS 7.0的iPhone4

任何线索都非常感谢。 多谢!

检查目标文件是否已存在。如果是,请将其删除。

我试图将文件添加到不存在的目录中。示例:/视频/视频.mov,只保留 /视频.mov工作。

好的,我有一些想法要告诉你。

当您说"它只显示一个帧,从不播放视频"时,我们有一个很好的指示,表明您的整个处理管道从头到尾只运行一次,然后停止工作。

这告诉我们,您正确地将事物串在一起,但某些组件的存在时间不超过单个帧缓冲周期,随后整个过程停止。

看起来filtermovieWriter的作用域都限定在类中(我假设它们不是缺少下划线的属性,_filter and _movieWriter(。所以在这种方法完成后,他们将继续存在(如果我错了,请纠正我......

我认为你遇到麻烦的地方是你的(GPUImageView*)displayView

这可能应该声明为类属性(尽管它可以仅用作变量(,然后通过 nib 或视图控制器的 viewDidLoad 方法实例化。

正如你现在所拥有的,这一行:GPUImageView* filterView = (GPUImageView*)displayView;正在为未使用的 filterView 进行赋值(因此是不必要的(。目前尚不清楚displayView是否真的是GPUImageView的实例,或者当前方法完成后它是否仍然存在。(事实上你说它"是我以编程方式创建的 UIView"(

displayView 必须是 GPU 的子类才能使整个事情正常工作,并且它必须限定为类,而不是方法。

像这样声明它:

@property (strong, nonatomic)GPUImageView* displayView;

然后实例化它并从 viewDidLoad 中将其添加到您的视图层次结构中

movieFile1 = [[GPUImageMovie alloc] initWithURL:movieFileURL1];
movieFile2 = [[GPUImageMovie alloc] initWithURL:movieFileURL2];
movieFile2.runBenchmark = YES;
movieFile2.playAtActualSpeed = NO;
filter = [[GPUImageChromaKeyBlendFilter alloc] init];
[(GPUImageChromaKeyBlendFilter *)filter setColorToReplaceRed:0.0 green:1.0 blue:0.0];
[(GPUImageChromaKeyBlendFilter *)filter setThresholdSensitivity:0.4];
GPUImageView *filterView = (GPUImageView*)displayView;
[filter addTarget:displayView];
[movieFile1 addTarget:filter];
[movieFile2 addTarget:filter];
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
unlink([pathToMovie UTF8String]);
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(1920.0, 1280.0)];
[filter addTarget:movieWriter];
movieWriter.shouldPassthroughAudio = YES;
movieFile1.audioEncodingTarget = movieWriter;
[movieFile1 enableSynchronizedEncodingUsingMovieWriter:movieWriter];
[movieWriter startRecording];
[movieFile1 startProcessing];
[movieFile2 startProcessing];

[movieWriter setCompletionBlock:^{
   [filter removeTarget:movieWriter];
   [movieWriter finishRecording];
}];
if (outputPath) {
                finalURL = [[stongObj tempFileURL] copy];
                DebugLog(@"Start Filter Processing :%@",finalURL);
                DebugLog(@"movieUrl :%@",movieUrl);
         //   [CSUtils removeChuckFilePaths:@[outputPath]];

            //Create Image Movie Object
            _movieFile = [[GPUImageMovie alloc] initWithURL:outputPath];
            //_movieFile = [[GPUImageMovie alloc] initWithURL:[[NSBundle mainBundle] URLForResource:@"videoviewdemo" withExtension:@"mp4"]];
            _movieFile.runBenchmark = NO;
            _movieFile.playAtActualSpeed = YES;
            _movieFile.delegate = self;
            //Movie Writer Object
            _movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:finalURL size:CGSizeMake([UIScreen mainScreen].bounds.size.height,[UIScreen mainScreen].bounds.size.height)];
            //_movieWriter.delegate = self;
            //Create Selecetive GPU Image Filter
            [stongObj setGpuOutputFilter:selectedVideoFilterType];
            //Create Group Filter
            groupFilter = [[GPUImageFilterGroup alloc] init];
            [groupFilter addTarget:imageOutputFilter];
            // Only Single Filter is implemented.
            //Apply Initial and Terminal Filter
            [(GPUImageFilterGroup *)groupFilter setInitialFilters:[NSArray arrayWithObject:imageOutputFilter]];
            [(GPUImageFilterGroup *)groupFilter setTerminalFilter:imageOutputFilter];
            //_movieWriter -> groupFilter ->_movieFile
            [_movieFile addTarget:groupFilter];
            [groupFilter addTarget:_movieWriter];
            _movieWriter.shouldPassthroughAudio = YES;
            _movieFile.audioEncodingTarget = _movieWriter;
            [_movieFile enableSynchronizedEncodingUsingMovieWriter:_movieWriter];
            //Start Recording
            [_movieWriter startRecording];
            //Start Processing
            [_movieFile startProcessing];
            __weak typeof(self) weekSelf=self;
            [_movieWriter setCompletionBlock:^{
                __strong typeof(self) stongSelf=weekSelf;
                DebugLog(@"Movie Write Completed");
                //Finish Recording.
                [stongSelf.movieWriter finishRecording];
                //Release all object
                // [self releaseAllObject];
                //remove movieUrl,audioUrl,outputPath
                [CSUtils removeChuckFiles:@[movieUrl,audioUrl,outputPath]];
            }];

[_movieFile startProcessing];应用程序在此行的iOS 8中崩溃,但在iOS 7上运行良好

@Seasia创意,我没有足够的声誉通过该列表添加评论,我创建一个新列表来回答U。我检查了输出 URL,控制台日志"/var~~~~/tmpmerge.mp4",所以我意识到,我错过了一个"/"--->"/var~~~~/tmp/merge.mp4"。如果 url 不正确,项目会遇到相同的错误。希望能帮助一些人。

最新更新