这是我的第一篇文章,所以让我非常感谢外面的所有发帖人(我被动地广泛使用 - 太棒了!)
我正在使用旧的 Quicktime API 为 Mac OS X 开发视频导出工具。
简介:我从多个输入电影中剪切帧并将它们排列(缩放)到一个新的输出电影(一种媒体亭)。
由于许多需要的 QT 功能(例如编写时间码...)需要嵌套在 32 位应用程序中,我决定使用 32 位命令行工具离线执行此操作。该工具逐帧渲染(离线)并以 0.0 和 1.0 之间的值打印当前进度
它由主应用程序(Cocoa、GUI、现代的东西)通过 NSTask 调用。黑啤酒被 NSPipe 捕获。
我查看了一些示例,并将快速概述我的代码:
NSTask *task;
NSPipe *pipe;
float progress;
// prepare the offline process
//
//
-(void) prepareOfflineExport {
task = [[NSTask alloc] init];
pipe = [[NSPipe alloc] init];
[task setLaunchPath:pathToRenderer];
[task setStandardOutput:pipe];
}
// arguments are passed outside
// invoke the process
//
-(void) startOfflineExport {
progress = 0.0f;
NSArray *argv = [NSArray arrayWithObjects: /* command line args */, nil];
[task setArguments:argv];
NSFileHandle *fh = [pipe fileHandleForReading];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataReady:) name:NSFileHandleReadCompletionNotification object:fh];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskTerminated:) name:NSTaskDidTerminateNotification object:task];
[task launch];
[fh readInBackgroundAndNotify];
}
// called when data ready
//
//
-(void) dataReady:(NSNotification*)n {
NSData *d = [[n userInfo] valueForKey:NSFileHandleNotificationData];
if([d length]) {
NSString *s = [[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding];
progress = [s floatValue];
}
}
// called when process exits
//
//
-(void) taskTerminated:(NSNotification*)n {
task = nil;
progress = 1.0f;
}
现在的问题:
在 Xcode 中启动应用程序时(通过“运行”),一切正常。调用正确完成,该过程在活动监视器中可见,并且 NSLevelIndicator(在创新应用程序的人上)根据(浮动)进度变量进行得很好。
但是:如果我“归档”应用程序并在 Xcode 之外执行它,我的命令行工具的标准输出似乎永远不会到达应用程序。我试着写一个调试文件
-(void) dataReady:(NSNotification*)n
没有机会,它永远不会被调用!我在几台Mac上测试了这个问题,同样的问题......
我是否犯了明显的错误,或者是否有一些偏好配置(沙盒已关闭),可能是我忽略的已知问题?
谢谢你的帮助
问候垫