3

これは私の最初の投稿なので、そこにいるすべての投稿者に感謝します(私は非常に受動的に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で問題をテストしました、同じ問題...

私は明らかな間違いを犯しましたか、それとも構成するためのいくつかの設定がありますか(サンドボックスがオフになっています)、おそらく私が見落としていた既知の問題ですか?

助けてくれてありがとう

あいさつマット

4

0 に答える 0