我在运行 GPUImage 时遇到问题。我已经修改了 SimpleVideoFileFilter 程序(用 chromakeyfilter 替换了过滤器)并且正在使用我自己的视频。由于以下错误,我的程序正在终止:
[AVAssetWriter startWriting] 状态为 3' 时无法调用方法
我浏览了论坛,但不确定为什么电影作者要关闭然后有人给它写信。
我正在使用运行 iOS 7.0 的 iPhone4
非常感谢任何线索。非常感谢!
检查您的目标文件是否已经存在。如果是,请将其删除。
我试图将文件添加到不存在的目录中。示例:/Videos/Video.mov,让它只是/Video.mov工作。
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];
}];
好的,我有一些想法给你。
当您说“它只显示一个帧而从不播放视频”时,我们有一个很好的迹象表明您的整个处理管道从开始到结束只运行一次,然后停止工作。
这告诉我们您正在正确地将事物串在一起,但某些组件的存在时间不会超过单个帧缓冲区周期,因此整个过程会停止。
它看起来像filter
并且movieWriter
被限定为类(我假设它们不是属性,因为缺少下划线,_filter and _movieWriter
)。所以他们会在这个方法完成后继续存在(如果我错了,请纠正我......)
我认为你遇到麻烦的地方是你的(GPUImageView*)displayView
这可能应该被声明为一个类属性(尽管它可以作为一个变量工作),然后通过视图控制器的 nib 或 viewDidLoad 方法进行实例化。
正如您现在所拥有的那样,这一行:GPUImageView* filterView = (GPUImageView*)displayView;
正在为未使用的 filterView 进行分配(因此是不必要的)。目前尚不清楚它是否displayView
真的是一个实例,GPUImageView
或者当当前方法完成时它是否仍然存在。(实际上你说它“是我以编程方式创建的 UIView”)
displayView 必须是 GPUImageView 的子类才能使整个工作正常工作,并且必须将其范围限定为类,而不是方法。
像这样声明它:
@property (strong, nonatomic)GPUImageView* displayView;
然后实例化它并从内部将其添加到您的视图层次结构中viewDidLoad
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 上运行良好
@Seaasia Creative,我没有足够的声誉来通过该列表添加评论,我创建了一个新列表来回答 U。我检查了输出 URL,控制台日志“/var~~~~/tmpmerge.mp4”,所以我意识到那,我错过了一个“/”--->“/var~~~~/tmp/merge.mp4”。如果 url 不正确,项目会遇到同样的错误。希望能有所帮助。