#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. Не могли бы вы объяснить свой ответ. Возможно, вы можете поделиться своим исправленным кодом. У меня такая же проблема, и я вырываю волосы, пытаясь ее решить!