これは私の最初の投稿なので、そこにいるすべての投稿者に感謝します(私は非常に受動的にSOを使用しています-素晴らしいです!)
私は古き良きQuicktimeAPIを使用してMacOSX用のビデオエクスポートツールに取り組んでいます。
簡単な説明:複数の入力ムービーからフレームを切り取り、それらを新しい出力ムービー(メディアキオスクの一種)にアレンジ(スケーリング)します。
必要なQT機能の多く(タイムコードの記述など)は32ビットアプリケーションにネストする必要があるため、32ビットコマンドラインツールを使用してこれをオフラインで実行することにしました。ツールはフレームごとに(オフラインで)レンダリングし、現在の進行状況を0.0〜1.0の値で出力します
これは、NSTaskを介してメインアプリケーション(Cocoa、GUI、最新のもの)によって呼び出されます。スタウトは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で問題をテストしました、同じ問題...
私は明らかな間違いを犯しましたか、それとも構成するためのいくつかの設定がありますか(サンドボックスがオフになっています)、おそらく私が見落としていた既知の問題ですか?
助けてくれてありがとう
あいさつマット