首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFileHandleReadCompletionNotification未过帐

NSFileHandleReadCompletionNotification未过帐
EN

Stack Overflow用户
提问于 2011-10-22 16:08:29
回答 1查看 792关注 0票数 0

我有一个关于NSFileHandleReadCompletionNotification不发帖的问题。我正在通过管道将一个NSTask的结果传递给另一个。无论出于什么原因,我的getData方法都不会被调用。有什么想法吗?这两个任务都工作正常,因为我正在将预期的文件写入我的硬盘。只是没有通知。

代码语言:javascript
复制
- (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];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-26 12:31:45

还需要在后台读取stdError。将其输出到管道中,但没有读取它,因此缓冲区被填满。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7858214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档