NSFileHandleReadCompletionNotification не публикуется

#objective-c

#objective-c

Вопрос:

У меня возникла проблема с тем, что NSFileHandleReadCompletionNotification не публикуется. Я передаю результаты одной NSTask в другую. По какой-либо причине мой метод getData просто не будет вызван. Есть идеи? Обе задачи работают правильно, потому что я получаю ожидаемые файлы, записанные на мой жесткий диск. Просто нет уведомления.

 - (void) encodeVideo:(NSString*)path
{
    NSString* ffmpegPath = [[NSBundle mainBundle] pathForResource:@"ffmpeg" ofType:@""];
    NSString* presetFile = [[NSBundle mainBundle] pathForResource:@"128" ofType:@"ffpreset"];

    NSTask* encodeTask = [[NSTask alloc] init];

    NSMutableArray* arguments = [[NSMutableArray alloc] init];
    [arguments addObject:@"-y"];
    [arguments addObject:@"-i"];
    [arguments addObject:path];
    [arguments addObject:@"-f"];
    [arguments addObject:@"mpegts"];
    [arguments addObject:@"-ac"];
    [arguments addObject:@"2"];
    [arguments addObject:@"-fpre"];
    [arguments addObject:presetFile];
    [arguments addObject:@"-s"];
    [arguments addObject:@"320x240"];
    [arguments addObject:@"-aspect"];
    [arguments addObject:@"320:240"];
    [arguments addObject:@"-async"];
    [arguments addObject:@"2"];
    [arguments addObject:@"-"];

    [encodeTask setLaunchPath: ffmpegPath];
    [encodeTask setArguments: arguments];
    [encodeTask setStandardOutput:[NSPipe pipe]];

    NSMutableArray* segmentArguments = [[NSMutableArray alloc] init];
    [segmentArguments addObject:@"-t"];
    [segmentArguments addObject:@"10"];
    [segmentArguments addObject:@"-f"];
    [segmentArguments addObject:@"/Users/Morgan/Desktop/LiveStreamServer/video"];
    [segmentArguments addObject:@"-S"];
    [segmentArguments addObject:@"1"];

    NSString* segmenterPath = [[NSBundle mainBundle] pathForResource:@"mediastreamsegmenter" ofType:@""];
    NSLog(@"%@", segmenterPath);
    NSTask* segmentTask = [[NSTask alloc] init];

    [segmentTask setLaunchPath: segmenterPath];
    [segmentTask setArguments: segmentArguments];

    [segmentTask setStandardInput:[encodeTask standardOutput]];
    [segmentTask setStandardOutput:[NSPipe pipe]];
    [segmentTask setStandardError:[NSPipe pipe]];

    NSFileHandle *file = [[segmentTask standardOutput] fileHandleForReading];
    [file readInBackgroundAndNotify];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getData:) name:NSFileHandleReadCompletionNotification object:file];

    [segmentTask launch];
    [encodeTask launch];

    [arguments release];
    [segmentArguments release];
}

- (void) getData: (NSNotification *)aNotification
{
    NSData *data = [[aNotification userInfo] objectForKey:@"NSFileHandleNotificationDataItem"];
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"%@", string);
    [[aNotification object] readInBackgroundAndNotify];
}
  

Комментарии:

1. Я знаю, что вы уже решили проблему. Я бы хотел добавить комментарий, потому что это распространенная ошибка, которую совершают многие люди. Вы всегда должны использовать определения, предоставляемые системой, поэтому рекомендуется использовать NSFileHandleNotificationDataItem вместо @»NSFileHandleNotificationDataItem», потому что, если вы неправильно напишете строку, вы получите проблемы, которые трудно найти. Если вы неправильно напишете определение, указанное в заголовочных файлах, вы просто получите ошибку компиляции и сможете ее немедленно обнаружить.

Ответ №1:

Также необходимо прочитать stdError в фоновом режиме. Выводил его в канал, но не читал его, поэтому буфер был заполнен.

Комментарии:

1. Не могли бы вы объяснить свой ответ. Возможно, вы можете поделиться своим исправленным кодом. У меня такая же проблема, и я вырываю волосы, пытаясь ее решить!