@weichsel 非常感谢。这似乎应该工作。但是,我正在使用 dispatch_group_wait ,它似乎没有等待。自从您第一次回复以来,我一直在反对它几个小时,但现在幸运了。这是我所做的:
添加了一个调度组的属性,称为 videoDispatchGroup,并在进行视频处理的类的 init 中调用 dispatch_group_create
在创建视频轨道的方法中,使用 dispatch_group_async(videoDispatchGroup, dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [videoWriter finishWritingWithCompletionHandler:^{
视频轨道写入方法是从将各个步骤链接在一起的方法中调用的。在该方法中,在调用写入曲目之后,我调用 dispatch_group_wait(videoProcessingGroup, DISPATCH_TIME_FOREVER);
在 dealloc 中,调用 dispatch_release(videoDispatchGroup)
这一切都被忽略了,但实际上对 dispatch_group_wait 的调用似乎并没有在等待。我的猜测是它与 dispatch_group_asyn 调用有关,但我不确定到底是什么。
我找到了另一种处理方法,通过finishWritingWithCompletion 处理程序上的异步处理程序使用我自己的int 计数/减量。但我真的很想通过更好地理解 GCD 来提高我的技能。
这是代码—— dispatch_group_wait 似乎永远不会触发,但电影本身是制作的。为简洁起见,省略了一些代码,但没有删除任何没有 GCD 代码的代码。
@implementation MovieMaker
// This is the dispatch group
@synthesize videoProcessingGroup = _videoProcessingGroup;
-(id)init {
self = [super init];
if (self) {
_videoProcessingGroup = dispatch_group_create();
}
return self;
}
-(void)dealloc {
dispatch_release(self.videoProcessingGroup);
}
-(id)convert:(MTCanvasElementViewController *)sourceObject {
// code fails in same way with or without this line
dispatch_group_enter(self.videoProcessingGroup);
// This method works its way down to writeImageArrayToMovie
_tracksData = [self collectTracks:sourceObject];
NSString *fileName = @"";
// The following seems to never stop waiting, the movies themselves get made though
// Wait until dispatch group finishes processing temp tracks
dispatch_group_wait(self.videoProcessingGroup, DISPATCH_TIME_FOREVER);
// never gets to here
fileName = [self writeTracksToMovie:_tracksData];
// Wait until dispatch group finishes processing final track
dispatch_group_wait(self.videoProcessingGroup, DISPATCH_TIME_FOREVER);
return fileName;
}
// @param videoFrames should be NSArray of UIImage, all of same size
// @return path to temp file
-(NSString *)writeImageArrayToMovie:(NSArray *)videoFrames usingDispatchGroup:(dispatch_group_t)dispatchGroup {
// elided a bunch of stuff, but it all works
AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:[NSURL fileURLWithPath:result]
fileType:AVFileTypeMPEG4
error:&error];
//elided stuff
//Finish the session:
[writerInput markAsFinished];
dispatch_group_async(dispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[videoWriter finishWritingWithCompletionHandler:^{
dispatch_group_leave(dispatchGroup);
// not sure I ever get here? NSLogs don't write out.
CVPixelBufferPoolRelease(adaptor.pixelBufferPool);
}];
});
return result;
}