我有NSFileHandleReadCompletionNotification不张贴的问题。我正在将一个ntask的结果传送到另一个ntask中。无论出于何种原因,我的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];
}
也需要在后台读取stdererror。将它输出到管道中,但没有读取它,因此缓冲区被填满了。